Collect
1,Collect
(1)T collect() 聚合,收集stream一系列中间操作产生的结果
(2)Collectors(java.util.stream.Collectors)类,用于操作结果的工具类
[1]groupBy()/mapping()
[2]toList()/toSet()/toMap()
(3)案例分析
//映射成一个苹果颜色的集合
private static void collect() {
APPLES.stream()
//先通过映射将集合内元素的类型转换成Color
.map(Apple::getColor)
//toSet相当于将相同元素过滤掉,Set:数学意义上的集合
.collect(Collectors.toSet())
.forEach(System.out::println);
}
//基于颜色进行分组,形成Map,键值为颜色,值为该颜色苹果的集合
private static void collectGroupingBy() {
//键是color,值是苹果列表
Map<Apple.Color, List<Apple>> map = APPLES.stream()
//以color为键,与这个键相同的将会自动放到列表中当值
.collect(Collectors.groupingBy(Apple::getColor));
}
//以ID为键,苹果对象为值。自定义键值对
//forEach遍历
private static void collectGroupingBy2() {
APPLES.stream()
.collect(Collectors.toMap(Apple::getId, a -> a))
//以苹果的id为键,以苹果为值,第二个参数是一个表达式所以是 a->a
.forEach((k, v) -> {
//在新的java版本中Map支持forEach方法的遍历,所以可以使用
System.out.println(k + "/" + v.getColor());
});
}
(4)函数式编程不应对外部数据产生影响,函数独立于类/对象
[如果需要使用,外部数据必须要是final才能进行引用]
2,RemoveIf
(1)Collection接口中定义,移除符合函数表达式的元素,底层依然基于Iterator迭代器实现
(2)RemoveIf不是集合流的方法是集合的方法
(3)实例:
//通过迭代器进行迭代删除
private static void iteratorRemove() {
Iterator<User> iUsers = USERS.iterator();
while (iUsers.hasNext()) {
User u = iUsers.next();
if ("SUN".equals(u.getName())) {
iUsers.remove();
}
}
for (User u : USERS) {
System.out.println(u.getName());
}
}
//通过removeIf进行元素删除,使代码更佳简洁
//实际上在帮助文档中可以看出removeIf的底层就是基于Iterator迭代器实现
private static void removeIf() {
//当名字是SUN直接移除
USERS.removeIf(u -> "SUN".equals(u.getName()));
//循环输出
for (User u : USERS) {
System.out.println(u.getName());
}
}
3,函数式接口
(1)函数式接口:只能包含一个抽象方法的接口
(2)函数式接口中,仅声明定义函数的参数/参数类型/返回类型,使用时具体实现
(3)@Functionallnterface(java.lang.Functionllnerface)注释,声明该接口为函数式接口,只要是只包含一个抽象方法的函数式接口,可以省略:当接口中定义多于1个抽象方法时,无法编译
(4)例子:
package com.experiment_1;
@FunctionalInterface
public interface MyFunction {
//声明了一个返回值为int,参数类型为int的抽象函数
int getValue(int x);
}
package com.experiment_1;
public class Test {
public static void main(String[] args) {
//变量f的值是后面括号内写的函数
//变量f的类型是MyFunction
MyFunction f = x ->{return x * x;};
//实现了之前声明的函数
//我们将函数赋值给了变量,所以这里的变量f代表的就是函数,也就实现了之前所说的函数可以作为参数进行传递
}
}