基础语法
Lambda需要函数式接口支持 接口用@Functiona1Interface修饰,就是函数式接口
Lambda操作接口(函数式接口:一个接口 就一个抽象方法)
Java 8引入了新的操作符“->”
该操作符把lambda拆分成两部分
左侧对应表达式的参数列表(接口所需要的参数,参数类型不需要写,jvm会根据上下文推断,如jdk7后List list = new ArrayList<>();)
右侧表达式中所需要实现的功能(接口的实现)
语法格式一:无参数,无返回值
() -> 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);
JAVA8内置四大核心函数式接口
1: Consumer消费型接口;
Void accept(T t);
2: Supplier 供给型接口
T get();
3: Function 函数式接口
R apply(T t);
4 : Predicate(T)断言型接口
Boolean test(T t);
核心函数只是体现接口,实现自己所需要的功能,根据功能场景选择函数接口,
如需要返回值供给型(其他接口都是大同小异)
Lambda表达式引用
方法引用:
a)若Lambda体中的功能,已经有方法提供了实现,可以使用方法引用,可以将方法引用理解为Lambda表达式的另外一种表现形式)
对象的引用::实例方法名调用类的getName()
Supplier sup2 = emp::getName;
String name = sup2.get();
类名::静态方法名
类名::实例方法名
①方法引用所引用的方法的参数列表与返回值类型,需要与函数式接口中抽象方法的参数列表和返回值类型保持一致!
②若Lambda的参数列表的第一个参数,是实例方法的调用者,第二个参数(或无参)是实例方法的参数时,格式:ClassName::MethodName
构造器引用
数组引用类型[] :: new
强大的Stream API
Stream是一个抽象流的概念 ,生成流后通过中间操作数据源(集合,数组)产生一个新的元素序列。就像SQL一样
Stream是延迟执行 需要数据才执行,执行效率非常非常高。高效
获取Stream
中间操作
对流进进行一些列操作,得到自己想要的流数据,像SQL对数据进行 过滤 求和
得到想要的数据中间操作都返回流
映射map flatMap
排序
终止操作
当执行终止操作,中间操作会一次性执行,没有执行终止操作,中间操作就是个摆设