在java8中引入了一个新的操作符“->” ,即是lambda表达式,可以把它看作是两部分。左侧:lambda表达式的参数列表 右侧:所需执行的功能。
其中它有四大核心接口:
函数名称 参数类型 返回类型 用途
Consumer T void 对类型为T的继承应用操作,包含方法:void accept(T)
Supplier<T> 无 T 返回类型为T的对象,包含: T get();
Function<T,R> T R 对类型为T的对象操作,返回结果,包含方法:R apply(T)
Predicate<T> T boolean 确定类型为T的参数对象是否满足某约束 boolean test(T)
语法格式一:无参数,无返回值 ex:
//jdk1.8以前
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("hello");
}
};
runnable.run();
//jdk1.8以后
Runnable runnable = () -> System.out.println("hello");
runnable.run();
语法二:若是有一个参数,并且无返回值 (x)-> System.out.println(x);
语法三:若是有一个参数,小括号可以省略不写 x -> System.out.println(x);
语法四:若是有两个参数,并且lambda表达式有多条语句,如:
Comparator<Integer> comparator = (x,y) -> {
System.out.println("函数式接口");
return Integer.compare(x,y);
};
语法五:若lambda只有一条语句,返回值和大括号都可以省略不写
(一) Comparator<Integer> comparator = (x,y) -> Integer.compare(x,y);
建议使用下面这一种
(二)Comparator<Integer> comparator = Integer::compare;
ps: 类名::方法名
System.out.println(comparator.compare(2,2));
语法六:Lambda表达式的参数列表的数据类型可以省略不写,jvm编译可以进行‘类型推断’ 即:(Integer x,Integer y) -> Integer.compare(x,y);
二:流(stream):是数据渠道,用于操作数据源(集合,数组)等生成的数据序列。集合讲的是数据,流讲的是计算
stream一:自己不会存储元素
二:不会改变源对象。相反,他们会返回一个持有结果的新Stream
三:操作是延迟执行的,意味着他们会等到需要结果的时候才执行。
筛选与切片
filter——接收lambda,从流中排除某些元素。
limit——截断流,使其元素不超过给定数量
skip(n)——跳过元素,返回一个扔掉了n个元素的流。若流中元素不足n个,则返回一个空流,与limit互补
distinct——筛选,通过生成元素的hashCode和eque去除重复元素
映射:
map——接受lambda,将元素转换为其他形式或提取信息,接受一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素
flatMap——接受一个函数作为参数,将流中的每一个值都换成另一个流,然后把所有流连续成一个流