方法引用可以被看做仅仅调用特定方法情形下的Lambda的一种快捷写法。它表示,如果一个Lambda表达式代表的只是直接调用这个方法,那最好还是用名称来调用它,而不是去描述如何调用它。
示例:
(Apple a)->a.getWeight() 等价于方法引用的 Apple::getWeight
(str,i)->str.substring(i) 等价于string::substring
如何构建方法引用:
指向静态方法的方法引用:
指向任意类型的实例方法的方法引用
指向现有对象的实例方法的方法引用
构造函数引用
对于一个现有构造函数,可以利用它的名称和关键字new来创建它的一个引用ClassName::new
Supplier<Apple> c1= Apple::new; Apple a1=c1.get(); Function<Integer,Apple> c2=Apple::new; Apple a2=c2.apply(110); BiFunction<String,Integer,Apple> c3=Apple::new; Apple a3=c3.apply(“green”,110);
三、Stream
1.Stream的概念简析
流(Stream)是Java API的新成员,允许你以声明性方法处理数据集合(在一定程度上有点类似于SQL语句),它表示的是要做什么,而不是怎么做。此外,它还可以透明的并行处理。
下面先就展现一个流的示例写法:
List<String> threeHighCaloricDishNames = menu.stream()
//筛选
.filter(dish -> dish.getCalories()>500)
//排序,降序
.sorted(comparing(Dish::getCalories).reversed())
//转换
.map(Dish::getName)
//限制输出为3个
.limit(3)
//将流转换为集合
.collect(Collectors.toList());
System.out.println(threeHighCaloricDishNames);
上述代码完成了下述操作:
获取一个数据源(source)→ 数据转换→执行操作获取想要的结果
这里我们将数据转换中的操作称为中间操作,最后的执行操作获得想要的结果称作终端操作。
2.Stream的基本操作
以下是一些常见的中间操作和终端操作
中间操作
操作
返回类型
操作参数
函数描述符
filter
Stream<T>
Predicate<T>
T->boolean
map
Stream<R>
Function<T,R>
T->R
faltmap
Stream<R>
Function<T,R>
T->Stream<R>
limit
Stream<T>
sorted
Stream<T>
Comparator<T>
(T,T)->int
distinct
Stream<T>
终端操作
操作
返回类型
目的
forEach
void
消费流中的每个元素并对其应用Lambda。
count
long
返回流中的元素个数
collect
根据目的决定
把流规约成一个集合,如List、Map、Set甚至是Integer。
anyMatch
boolean
检查流中是否有所有元素能匹配给定的谓词
anyMatch
boolean
检查流中是否有一个元素能匹配给定的谓词
findAny
Optional<T>
查找到任一个匹配给定谓词的元素
findFirst
Optional<T>
查找到第一个匹配给定谓词的元素
reduce
Optional<T>
将流中所有元素组合起来,完成指定的操作,如求和、求积、求最大值、最小值等
注意点:
每次转换原有 Stream 对象不改变,返回一个新的 Stream 对象(可以有多次转换),这就允许对其操作可以像链条一样排列,变成一个管道