我们想要把某些功能传递给某个方法,总要去写匿名类,就还是复杂了,因为其核心部分只是里面的函数表达式,于是Java 8 增加了一个语言级的新特性,名为 Lambda 表达式。
Lambda 表达式是一个匿名函数,我们可以把 lambda 表达式理解为一段
可以传递的代码(将代码段像数据一样传递)。使用它可以写出更简洁, 更灵
活的代码。
Lambda 表达式的本质只是一个"语法糖",你可以使用更少的代码来实现同样的功能。
*这里解释下语法糖:
也叫糖衣语法,指计算机语言中添加的某种语法,这种语法对语言的功能没有影响,但更方便程序员的使用。这种语法能够增强程序的可读性,从而减少程序代码出错的机会。
1.可以显式声明参数的类型,也可以由编译器自动从上下文推断参数的类型。
例如 (int a,int b)与 (a,b)相同。
·参数用小括号括起来,用逗号分隔。例如 (a, b) 或 (int a, int b) 或 (String
a, int b, float c)
·空括号用于表示一组空的参数。例如 () -> 42。
·当有且仅有一个参数时,如果不显式指明类型,则不必使用小括号。
例如 a -> return a*a。
·Lambda 表达式的正文可以包含零条,一条或多条语句。
·如果 Lambda 表达式的正文只有一条语句,则大括号可不用写,且表达式
的返回值类型要与匿名函数的返回类型相同。
· 如果 Lambda 表达式的正文有一条以上的语句必须包含在大括号(代码块)
中,且表达式的返回值类型要与匿名函数的返回类型相同。
1.Lambda 表达式只支持函数式接口 也就是只有一个抽象方法的接口.也就是功能接口,也称为单抽
象方法接口。
2.注解标签:@FunctionalInterface 违反时有提示
实例:
注:只能用一个抽象方法
案例:
//Shape d这里 就是 直接调实现Shape接口的area()方法 传参进去
1.流(Stream)
可以提供了许多对集合,数组进行遍历操作的方法(java提供的高级迭代器)
stream 与 lambada 表达示结合后编码效率与大大提高,并且可读性更强。
2.操作:
获取流
流操作
简单来说,我们通过一个集合的 stream 方法获取一个流,然后对流进行一 系列流操作,最后再构建成我们需要的数据集合。
简单说就是widgets集合 .stream()作用就是把集合放到stream流中产生一个stream对象 在对象上.调用sorted()方法 把最后的数据又放到集合widgets中
虽然说高级迭代器,但不需要说明实现for循环,只需要说明想要完成什么(筛选 排序 取值 )一条龙服务
所以说Stream允许你以声明的方式处理数据集合 可以把他看作是遍历数据集的高级迭代器。与IO流是完全不同概念。
到底什么是流:从支持数据处理操作的源,生成的元素序列
即 java中提供stream接口,他可以对集合 数组进行各种操作
3.获取流:
4.操作流:
流操作可以分为两类:中间操作和终端操作
中间操作:
filter:过滤流中的某些元素,
sorted(): 自然排序,流中元素需实现 Comparable 接口
distinct: 去除重复元素
limit(n): 获取 n 个元素
skip(n): 跳过 n 元素,配合 limit(n)可实现分页
map(): 将其映射成一个新的元素
终端操作 :最终将流转变为想要的结果
forEach: 遍历流中的元素
toArray:将流中的元素倒入一个数组
Min:返回流中元素最小值
Max:返回流中元素最大值
count:返回流中元素的总个数
Reduce:所有元素求和
anyMatch:接收一个 Predicate 函数,只要流中有一个元素满足条件则返
回 true,否则返回 false
allMatch:接收一个 Predicate 函数,当流中每个元素都符合条件时才返
回 true,否则返回 false
findFirst:返回流中第一个元素
collect:将流中的元素倒入一个集合,Collection 或 Map
中间操作后得到的还是一个流
//数组获取流
Integer [] a = new Integer[10];
Stream stream1 = Arrays.stream(a);
Stream stream2 = Stream.of(1,2,3,4,5,6,7);//stream1 stream2都是这样操作的 数组 两种方式而已 下面stream2为例
stream2
.filter( (e)->{ return e>3; } )
.forEach( (e1->{
System.out.println(e1);
}));
List alist = stream2 //意思是终端操作后转成集合的List类型
.filter( (e)->{ return e>3; } ) //中间 操作 条件过滤
.collect(Collectors.toList()); //终端操作 最终将流转为我们想要的结果
System.out.println(alist);
ArrayList list = new ArrayList<>();
list.add(3);
list.add(2);
list.add(1);
list.add(1);
list.add(5);
list.add(4);
list.add(4);
list.add(6);
list.add(7);
list.stream()
.sorted( (o1,o2)->{ return o1-o2;} )
.forEach((e)->{
System.out.println(e);
});