collect

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代表的就是函数,也就实现了之前所说的函数可以作为参数进行传递
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值