Lambda表达式和Stream

Java 8的改变

Java 8的改变让我们的编程变的更加容易。使线程使用起来更加简单,让CPU能够充分利用。同时提供了一个新的API(称为"流",Stream)。

方法传递代码的改变

因为Java 8的出现,导致了方法当作代码参数传递变的非常容易。

在Java 8 出现之前我们编写"向方法传递代码的能力" 通常使用匿名类或者将代码封装成类方法进行传递。eg.

Collections.sort(list,new Comparator<Integer>(){
	@Override
    public int compare(User o1, User o2) {
		return o1.getId().compareTo(o2.getId());
   	}
})

但在Java 8中,我们可以使用更为简单的Lambda表达式实现。eg.

 //具体作用后续介绍
 list.sort(Comparator.comparing(User::getId));

主要意思是"通过用户编号,给用户集合排序"。

函数式接口

只有一个方法的接口,通常使用@FunctionalInterface注解完成,Lambda表达式专门针对只有一个方法的接口(如果方法中有很多个默认方法,只有一个方法的接口也是函数式接口)
通常我们会将函数式接口的方法声明成泛型,以便于扩展
eg.

	@FunctionalInterface
	public interface DefaultInterface {
	    default String getName(){
	        return "abc";
	    }
	    String getName(User user);
	}

函数描述符

函数式接口的抽象方法的签名称为函数描述符,函数描述符就是接口本身
。我通常将函数描述符通常理解为已经规定好行为的接口(相当于匿名类的类型)。正因为函数描述符的存在也让我们不用在编写匿名类,Java 8常见的函数描述符:

Predicate

可接收泛型T对象,并返回一个boolean。主要方法:test方法

 	boolean test(T t);

Consumer

可接收泛型T对象,没有返回值(void)。主要方法:accept方法

扫描二维码关注公众号,回复: 8789378 查看本文章
    void accept(T t);

Function

可接收泛型T对象,返回一个泛型R对象。主要方法:apply方法

    R apply(T t);

自定义函数描述符

接上述 "DefaultInterface"接口编写

//给自定义函数描述符赋值并使用
DefaultInterface defaultInterface=(user1)->user1.getName()+"abc";
System.out.println(defaultInterface.getName(user));

Lambda表达式

Lambda表达式的基本格式为(x1,x2)->{表达式}

多参数

  1. 如果lambda表达式带有两个参数,此时参数类型可以省略,但括号不能省略
  2. 如果表达式只有一行,那么表达式的花括号可以省略

无参数

  1. 参数的括号不能省略
  2. 其他语法与多参数相同

一个参数

  1. 可以省略参数的括号和类型
  2. 其他语法与多参数相同

方法引用

方法引用相当于一种调用特定方法的Lambda表达式的写法,就是让你根据已有的方法来实现lambda表达式,并不是每次都需要去指定行为

指向静态方法的方法引用

例如Integer中的parseInt方法,可以写成Integer::parseInt。相当于Lambda中的 (s)->Integer.parseInt(s); 一个String类型的参数,返回值为int;

指向任意类型实例方法的方法引用

例如String中的length方法,可以写成String::length。相当于Lambda中的(s)->s.length();一个String类型的参数,返回值为int;

指向现有对象的实例方法的方法引用

假如有一个局部变量s,它支持length方法,则可以写成s::length。相当于Lambda中的()->s.length();无参数,返回值为int;

构造器引用

构造器引用同方法引用类似,同样作用于函数式接口。语法 CalssName::new

并行处理和Stream

目前绝大多数的Java程序都只使用了CPU其中一个内核,并没有将CPU的资源最大化利用。但线程用起来很难,也容易出现错误。所以Java对并行有了一个更简单的新思路。例如:Stream.
Stream支持许多处理数据的并行操作。而这种并行执行操作比使用synchronized编写代码不但出错率低,在多核CPU上执行的成本要更低。
从我的角度来看,我觉得在Java 8中加入Stream可以看作把"方法传递代码"加入Java 8的主要原因。
当然"方法传递代码"也不仅仅只能用于Stream。我们也可以将两个只用几行代码不同的方法提取出来,专门做一个方法,将那几行不同方法的代码做为参数传入该方法中

发布了2 篇原创文章 · 获赞 5 · 访问量 69

猜你喜欢

转载自blog.csdn.net/qq_41636344/article/details/86742717