1. lambda表达式
函数式接口简单来说就是只有一个抽象函数的接口。为了使得函数式接口的定义更加规范,java8 提供了@FunctionalInterface 注解告诉编译器在编译器去检查函数式接口的合法性,以便在编译器在编译出错时给出提示。
1.1 操作符
java8中引入了操作符“->”,称为箭头操作符或lambda操作符,lambda用于替换匿名函数。lambda操作符将lambda表达式拆成两个部分:
(1)左侧是lambda表达式的参数列表(可以理解为抽象方法的参数)
(2)右侧是lambda表达式中需要执行的功能,即lambda体(可以理解为抽象方法的实现的功能)
- 格式一:无参数,无返回值:
()->System.out.println(“Hello Lambda!”); - 格式二:有一个参数,无返回值(如果只有一个参数可以省略(),如果只有一条语法可以省略{})
(x)->System.out.println(x); - 格式三:只有一个参数,小括号可以省略不写
x -> System.out.println(x); - 格式四:有两个以上的参数,有返回值,并且 Lambda 体中有多条语句
Comparator com = (x, y) -> {System.out.println(“函数式接口”);return Integer.compare(x, y);}; - 格式五:如果 Lambda 体中只有一条语句, return和大括号都可以省略不写
Comparator com = (x, y) -> Integer.compare(x, y); - 格式六:Lambda 表达式的参数列表的数据类型可以省略不写,因为JVM编译器通过上下文推断出数据类型,即“类型推断”
(Integer x, Integer y) -> Integer.compare(x, y);
1.2. ::关键字
Java 8 中我们可以通过 ::
关键字来访问类的构造方法,对象方法,静态方法。
比如静态方法的引用String::valueOf,可以代替x->String.valueOf(x)
比如构造器的引用ArrayList::new,可以代替x->new ArrayList(x)
比如对象方法的引用Student::getId,可以代替x->x.getId()
Stream.of(1,2,3,4,5,6,8,9,0).collect(Collectors.toCollection(ArrayList::new));
1.3 使用与分类
加上@FunctionalInterface就可以将一个函数变为函数式接口
函数式接口也就只分为 Function、Operator、Consumer、Predicate、Supplier 这五大类。
Consumer:定义了一个accept()的抽象方法,它接收泛型T的对象,没有返回(void)。简单来说就是:接收一个输入参数,不返回结果。
Function:定义了一个apply()方法,它接收一个泛型T的对象,并返回一个R对象。一句话解释就是:输入一个参数,返回一个结果。
BitFunction:一句话总结就是:接收两个参数,得到一个结果。
Predicate:一句话解释就是:接收一个参数,返回一个布尔值。
Supplier:一句话解释就是:不接收任何参数,返回一个结果。
BinaryOperator:接收两个相同类型的参数,返回一个结果。
2. Stream:
https://www.jianshu.com/p/11c925cdba50:一、操作符简介
https://www.jianshu.com/p/2338cabc59e1:二、函数式接口
https://www.jianshu.com/p/6ee7e4cd5314:三、collect收集器
https://www.jianshu.com/p/461429a5edc9:四、intStream
https://www.jianshu.com/p/487cb3d61d9c:五:streamTrace
Steam分为①创建Stream;②中间操作;③终止操作。终止操作后可以再接一个forEach。