java stream-中间操作 filter、map、flatMap、reduce

filter

根据 规则 对数据进行 筛选过滤,符合规则的数据保留,不符合规则的数据丢弃。

例子 - Predicate接口对象

List<String> list = new ArrayList<>();
Collections.addAll(list,"李雷", "韩梅梅", "lucy", "lisi","李小四");
list.stream()
        .filter(new Predicate<String>(){

            @Override
            public boolean test(String item) {
                return item.startsWith("李");
            }
        }) // 过滤姓李的数据
        .forEach(item -> System.out.println(item));

例子 - lambda表达式

List<String> list = new ArrayList<>();
Collections.addAll(list,"李雷", "韩梅梅", "lucy", "lisi","李小四");
list.stream()
        .filter(item -> item.startsWith("李")) // 过滤姓李的数据
        .forEach(item -> System.out.println(item));

例子 - 多个条件

List<String> list = new ArrayList<>();
Collections.addAll(list,"李雷", "韩梅梅", "lucy", "lisi","李小四");
list.stream()
        .filter(item -> item.startsWith("李")) // 过滤姓李的数据
        .filter(item -> item.length() == 2) // 过滤姓名是2个字的
        .forEach(item -> System.out.println(item));

map

集合 中的 每个元素 传入 函数 后,生成一个新元素,并将 新元素 组成一个 集合,并返回该集合

注意:map处理前后的元素数量是相同的

例子

将流中的每个数据乘2

List<Integer> list = new ArrayList<>();
Collections.addAll(list,10,15,2,4,8);
list.stream()
        .map(item -> item * 2) // 将流中的每个数据乘2
        .forEach(item -> System.out.println(item));

flatMap

如果流中的数据是 数组集合,可以指定规则,将其展平

简单例子

Integer[] arr2 = {1,2};
Integer[] arr3 = {3,4};

Integer[][] arr = {arr2,arr3};

Arrays.stream(arr)
        .flatMap( item -> Arrays.stream(item))
        .forEach(item -> System.out.println(item));

复杂例子

List<String> list = new ArrayList<>();
Collections.addAll(list,"李雷 lili","韩梅梅 lucy");
list.stream()
        .flatMap( item -> Arrays.stream( item.split(" ") ))
        .forEach(item -> System.out.println(item));

reduce()

reduce() 函数会对集合中元素进行聚合:

  1. 将集合中的 第 1、2 个元素传给 lambda表达式,计算后得出结果
  2. 再将该结果与第3个元素 传给 lambda表达式,计算后得出结果
  3. 以此类推,最后得到结果

例子

求集合元素累加和

List<Integer> list = new ArrayList<>();
Collections.addAll(list,1,2,3,4);
Optional<Integer> res = list.stream()
        .reduce((i1, i2) -> i1 + i2);
System.out.println(res.get());

原文出处:https://malaoshi.top/show_1IX5HCIPoA6e.html