您当前的位置: 首页 > 

梁云亮

暂无认证

  • 2浏览

    0关注

    1211博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

第十章 Lambda 表达式

梁云亮 发布时间:2022-03-07 13:23:47 ,浏览量:2

10.1 lambda概念

Lambda 表达式”(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。Lambda表达式可以表示闭包(注意和数学传统意义上的不同)

Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。

Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。

使用 Lambda 表达式可以使代码变的更加简洁紧凑。

()->

->

()->{}

a->a

a->a*a

()->a

a->System.out::println;

10.2 排序实例
package part10;
import java.util.Arrays;
import java.util.Comparator;
public class Lam2 {
	public static void main(String[] args) {
		Integer[] num = new Integer[] { 1, 6, 2, 5, 10, 4 };
		System.out.println(Arrays.toString(num));

		Arrays.sort(num);
		System.out.println(Arrays.toString(num));

		//Arrays.sort(num, (a, b) -> a - b);
		Arrays.sort(num,new Comparator() {
			public int compare(Integer a, Integer b) {
				return a-b;
			}
		});
		
		System.out.println(Arrays.toString(num));

		Arrays.sort(num, (a, b) -> b - a);
		/*
		Arrays.sort(num,new Comparator() {
			public int compare(Integer a, Integer b) {
				return a-b;
			}
		}.reversed());
		*/
		System.out.println(Arrays.toString(num));
	}
}

  • 字符串排序方法
/**
 * 
 */
package part10;

import java.util.ArrayList;
import java.util.List;

/**
 * 字符串数组排序实现
 * 
 * @author webrx
 *
 */
public class Lam2 {

	public static void main(String[] args) {
		List list = new ArrayList(List.of("java", "B", "c", "jcva", "basic", "javascript", "python", "go", "perl", "php"));
		// 没有排序
		System.out.println(list);

		// 降序
		list.sort((a, b) -> b.compareTo(a));
		System.out.println(list);

		// 升序
		list.sort((a, b) -> a.compareTo(b));
		System.out.println(list);

		
		//根据字符串字符的个数,按大到小排序
		list.sort((a, b) -> b.length() - a.length());
		System.out.println(list);

	}

}

  • 对象排序方法
User.java
/**
 * 
 */
package part10;

public class User {
	private int id;
	private String name;
	private int score;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getScore() {
		return score;
	}
	public void setScore(int score) {
		this.score = score;
	}
	public User(int id, String name, int score) {
		super();
		this.id = id;
		this.name = name;
		this.score = score;
	}
	public User() {
		super();
		// TODO Auto-generated constructor stub
	}
	@Override
	public String toString() {
		return "User [id=" + id + ", name=" + name + ", score=" + score + "]";
	}
	

}



/**
 * 
 */
package part10;

import java.util.ArrayList;
import java.util.List;

/**
 * 对象排序
 * 
 * @author webrx
 *
 */
public class Lam4 {

	public static void main(String[] args) {
		List list = new ArrayList(List.of(new User(42,"Andy",18),new User(600,"张三丰",72),new User(1, "jack", 80), new User(2, "李四", 45), new User(35, "张三", 60), new User(60, "james", 90)));
		System.out.println(list);

		list.sort((a, b) -> b.getScore() - a.getScore());
		System.out.println(list);
		
		//根据姓名升序
		list.sort((a,b)->a.getName().compareTo(b.getName()));
		System.out.println(list);

	}

}

10.3 函数式接口 接口参数返回内容描述Predicate java.util.function.PredicateTboolean用于判别一个对象。比如求一个人是否为男性Consumer 消费型Tvoid用于接收一个对象进行处理但没有返回,比如接收一个人并打印他的名字Function 函数型TR转换一个对象为不同类型的对象Supplier 供给型NoneT提供一个对象UnaryOperatorTT接收对象并返回同类型的对象BinaryOperator(T, T)T接收两个同类型的对象,并返回一个原类型对象
/**
 * 
 */
package part10;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.stream.IntStream;

/**
 * 显示及格的学生信息
 * 
 * @author webrx
 *
 */
public class Lam5 {

	public static void main(String[] args) {
		
	
		List list = new ArrayList(List.of(new User(42, "Andy", 18), new User(600, "张三丰", 52), new User(1, "jack", 80), new User(2, "李四", 45), new User(35, "张三", 60), new User(60, "james", 90)));
		// System.out.println(list);

		//list.stream().filter(e -> e.getScore() < 60).forEach(System.out::println);
		//list.stream().filter(e -> e.getScore() < 60).forEach(e -> System.out.println(e));
		
		
		//list.stream().filter(e -> e.getScore() < 60 && !e.getName().startsWith("李")).forEach(System.out::println);
		
		Random rand = new Random();
		IntStream.generate(()->rand.nextInt(100)+1).limit(10).forEach(System.out::println);

	}

}

10.4 Stream流技术
  • IntStream
/**
 * 
 */
package part10;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.function.IntConsumer;
import java.util.stream.Collector;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import java.util.stream.Stream;

/**
 * IntStream
 * 
 * @author webrx
 *
 */
public class IntStreamTest {

	public static void main(String[] args) {

		IntStream is = IntStream.of(10, 20, 30, 40, 50);
		is.forEach(System.out::println);

		System.out.println(IntStream.rangeClosed(1, 100).sum());
		System.out.println(IntStream.generate(() -> 5).limit(3).count());

		IntStream i2 = IntStream.generate(() -> {
			Random rand = new Random();
			return rand.nextInt(100) + 1;
		}).limit(10);

		IntConsumer ic = (a) -> {
			System.out.printf("%d ", a);
		};

		i2.forEach(ic);
		System.out.println();

		IntStream.iterate(1, a -> a + 2).limit(5).forEach(ic);
		System.out.println();

		IntStream.iterate(2, a -> a + 2).skip(3).limit(15).forEach(ic);
		
		

		// IntStream 转换为 List
		List list = new ArrayList();
		list.add(1);
		list.add(1);
		list.add(1);

		System.out.println();
		// list.stream().forEach(System.out::println); //Stream

		//Stream ss = list.stream();
		IntStream ii2 = list.stream().mapToInt(i -> i);
		
		//Stream sa = ii2.boxed();
		List lis = ii2.boxed().collect(Collectors.toList());
		System.out.println(lis.size());

		// IntStream.iterate(1, a->a+2).limit(5).col
		
		
		List as = List.of("java","php");
		Stream sss = as.stream();
		

	}

}

  • Stream

    /**
     * 
     */
    package part10;
    
    import java.io.BufferedReader;
    import java.util.Arrays;
    import java.util.stream.Stream;
    
    /**
     * 显示及格的学生信息
     * 
     * @author webrx
     *
     */
    public class Stream1 {
    
    	public static void main(String[] args) {
    
    		int[] nums = new int[] { 1, 2, 3, 10, 20, 30, 50 };
    		System.out.println(Arrays.stream(nums).min().getAsInt());
    		System.out.println(Arrays.stream(nums).max().getAsInt());
    		System.out.println(Arrays.stream(nums).count());// 3
    		System.out.println(Arrays.stream(nums).sum());// 6
    		System.out.printf("%.2f%n",Arrays.stream(nums).average().getAsDouble());
    
    		Arrays.stream(nums).forEach(e -> System.out.printf("%02d ", e));
    		
    		//BufferedReader br = null;
    		//Stream c = br.lines();
    	}
    
    }
    
    
    
    /**
     * 
     */
    package part10;
    
    import java.util.Arrays;
    import java.util.stream.DoubleStream;
    import java.util.stream.IntStream;
    import java.util.stream.Stream;
    
    /**
     * 显示及格的学生信息
     * 
     * @author webrx
     *
     */
    public class Stream2 {
    
    	public static void main(String[] args) {
    
    		// Stream ss = Stream.of("java", "javascript", "mysql", "php",
    		// "python");
    
    		// ss.filter(e -> e.startsWith("java")).map(e ->
    		// e.toUpperCase()).forEach(System.out::println);;
    
    		int[] nums = new int[] { 30,1, 3, 5 ,20,15,100};
    		// IntStream is = Arrays.stream(nums).map(e -> e + 5);
    		IntStream is = Arrays.stream(nums).map(e -> e % 5 == 0 ? e + 5 : e);
    		is.forEach(System.out::println);
    		
    		double[] dd = new double[10];
    		Arrays.stream(dd).map(e->Math.random()).forEach(e->System.out.printf("%.2f ",e));
    		
    		System.out.println();
    		System.out.println(Stream.of(1,2,3,1,6,8,1,9,10,1,22).distinct().count());
    		
    		
    
    	}
    
    }
    
    
    
    /**
     * 
     */
    package part10;
    
    import java.util.Arrays;
    import java.util.stream.DoubleStream;
    import java.util.stream.IntStream;
    import java.util.stream.Stream;
    
    /**
     * 显示及格的学生信息
     * 
     * @author webrx
     *
     */
    public class Stream3 {
    
    	public static void main(String[] args) {
    
    		int num = 6;
    		IntStream is = IntStream.rangeClosed(1, 6);
    		int ok = is.reduce(1, (a, b) -> a * b);
    		System.out.println(ok);
    
    		System.out.println(1 * 1 * 2 * 3 * 4 * 5 * 6);
    		
    		Stream aa = Stam.of("mysql","php","java","javascript");
    		System.out.println(aa.reduce("", (a,b)->a.concat(b)));
    
    	}
    
    }
    
    
10.5 表达式双冒号
package cn.exam;

import java.util.Random;

public class User {
    private String name;
    private String sex;
    private boolean isMan;

    public User(String name,String sex){
        this.name = name;
        this.sex =sex;
        this.isMan = "男".equals(this.sex) ? true : false;
    }

    public static void println(User u){
        System.out.println(u);
    }


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public boolean isMan() {
        return isMan;
    }

    public void setMan(boolean man) {
        isMan = man;
    }

    private static Random rand = new Random();
    public static int rand(){
        return rand.nextInt(100)+1;
    }


    public static void println(int i) {
        System.out.printf("%02d ",i);
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", sex='" + sex + '\'' +
                ", isMan=" + isMan +
                '}';
    }
}


package cn.exam;
import java.io.*;
import java.net.InetAddress;
import java.util.Random;
import java.util.stream.DoubleStream;
import java.util.stream.IntStream;
import java.util.stream.Stream;

public class My {
    public static void main(String[] args) throws IOException {
        DoubleStream ds1 = DoubleStream.generate(Math::random).limit(5);
        DoubleStream ds2 = DoubleStream.generate(()->Math.random()).limit(5);

        Stream sr1 = Stream.generate(Random::new).limit(5);
        Stream sr2 = Stream.generate(()->new Random()).limit(5);

        IntStream is = IntStream.generate(User::rand).limit(10);


        is.forEach(User::println);

        //Stream su1 = Stream.generate(User::new).limit(5);
        Random ran = new Random();
        Stream su2 = Stream.generate(()->new User("jack"+Math.random(),ran.nextBoolean() ? "男":"女")).limit(15);
        //su2.filter((u)->u.isMan()).forEach(System.out::println);
        //su2.filter(User::isMan).forEach(User::println);
        su2.filter(User::isMan).forEach(e->e.println(e));

    }
}

作业:

求1+2+3+…+100 = ? 不使用循环和递归

关注
打赏
1665409997
查看更多评论
立即登录/注册

微信扫码登录

0.0475s