Stream流的终结方法(二)——collect

1.Stream流的终结方法

2. collect方法

collect方法用于收集流中的数据放到集合中去,可以将流中的数据放到List,Set,Map集合中

2.1 将流中的数据收集到List集合中

java 复制代码
package com.njau.d10_my_stream;

import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * 目标:掌握Stream流的终结方法
 * 名称                                                               说明
 * collect(Collector collector)                                       收集流中的数据 ,放到集合中
 */
public class StreamDemo10 {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        Collections.addAll(list,"张无忌-男-15","周芷若-女-16","赵敏-女-17","张强-男-18","张三丰-男-19","张翠山-男-23",
                "张良-男-20","王二麻子-男-21","谢广坤-男-22");

        // 1.收集到List集合中去
        Stream<String> stream1 = list.stream();
        List<String> stringList = stream1.collect(Collectors.toList());
        System.out.println(stringList);

        // 将所有男性收集到List集合中去
        Stream<String> stream11 = list.stream();
        List<String> stringList1 = stream11.filter(s -> "男".equals(s.split("-")[1])).collect(Collectors.toList());
        System.out.println(stringList1);
    }
}

使用.collect方法中的(Collectors.toList())方法可以将流中的数据收集到一个ArrayList集合中去。

2.2 将流中的数据收集到Set集合中

java 复制代码
package com.njau.d10_my_stream;

import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * 目标:掌握Stream流的终结方法
 * 名称                                                               说明
 * collect(Collector collector)                                       收集流中的数据 ,放到集合中
 */
public class StreamDemo10 {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        Collections.addAll(list,"张无忌-男-15","周芷若-女-16","赵敏-女-17","张强-男-18","张三丰-男-19","张翠山-男-23",
                "张良-男-20","王二麻子-男-21","谢广坤-男-22");

        // 2.收集到Set集合中去
        Stream<String> stream2 = list.stream();
        Set<String> stringSet = stream2.collect(Collectors.toSet());
        System.out.println(stringSet);      // set集合本就无序,不可重复

        // 将所有男性收集到Set集合中去,会转成HashSet集合,HashSet底层重写了hashCode和equals方法,因此相同的会去除重复
        Stream<String> stream21 = list.stream();
        Set<String> stringSet1 = stream21.filter(s -> "男".equals(s.split("-")[1])).collect(Collectors.toSet());
        System.out.println(stringSet1);
    }
}

使用.collect方法中的(Collectors.toSet())方法可以将流中的数据收集到一个HashSet集合中去。由于HashSet集合对于String类型在底层重写了equals方法和hashCode方法,因此会去除重复的元素。

2.3 将流中的数据收集到Map集合中

java 复制代码
package com.njau.d10_my_stream;

import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * 目标:掌握Stream流的终结方法
 * 名称                                                               说明
 * collect(Collector collector)                                       收集流中的数据 ,放到集合中
 */
public class StreamDemo10 {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        Collections.addAll(list,"张无忌-男-15","周芷若-女-16","赵敏-女-17","张强-男-18","张三丰-男-19","张翠山-男-23",
                "张良-男-20","王二麻子-男-21","谢广坤-男-22");
        // 3.收集到Map集合中去
        // 将所有男性收集到Map集合中去
        // toMap用法详解:
        /*
        参数一:表示生成键的规则
        参数二:表示生成值的规则
        匿名内部类new Function:
            泛型一:要作为键的数据原本的数据类型  泛型二:键的数据类型
            apply方法:
                形参:传入的要作为键(值)的原始数据
                方法体:生成键(值)
                返回值:键(值)的数据
        */
        Stream<String> stream3 = list.stream();
        Map<String, Integer> stringIntegerMap = stream3.filter(s -> "男".equals(s.split("-")[1])).
                collect(Collectors.toMap(new Function<String, String>() {
                                             @Override
                                             public String apply(String s) {
                                                 return s.split("-")[0];
                                             }
                                         },
                        new Function<String, Integer>() {
                            @Override
                            public Integer apply(String s) {
                                return Integer.parseInt(s.split("-")[2]);
                            }
                        }));
        System.out.println(stringIntegerMap);
    }
}

在toMap方法中要定义两个匿名内部类对象(分别对应参数1和参数2),第一个匿名内部类对象(参数1)是进行Map集合中键的生成的,第二个匿名内部类对象(参数2)是进行Map集合中值的生成的。

匿名内部类中的泛型1:要作为键(值)的数据原本的数据类型

匿名内部类中的泛型2:键(值)的数据类型

apply方法:

形参:传入的要作为键(值)的原始数据

方法体:生成键(值)
返回值:键(值)的数据

3. stream流总结

相关推荐
池️鱼3 分钟前
Maven 详解:从入门到实践
java·maven·intellij-idea
所谓伊人,在水一方3336 分钟前
【机器学习精通】第3章 | 正则化与泛化:防止过拟合的理论与实践
开发语言·人工智能·机器学习·信息可视化·系统架构
无心水8 分钟前
【java开发常见错误】5、HTTP调用避坑指南:超时、重试、并发,一个都不能少
java·开发语言·后端·http·架构师·http调用·后端开发错误
炸膛坦客9 分钟前
单片机/C语言八股:(五)32/64 位系统中,C/C++各变量类型所占字节数
c语言·开发语言·c++
所谓伊人,在水一方33311 分钟前
【Python数据可视化精通】第11讲 | 可视化系统架构与工程实践
开发语言·python·信息可视化·数据分析·系统架构·pandas
iPadiPhone12 分钟前
Java 泛型与通配符全链路解析及面试进阶
java·开发语言·后端·面试
ArturiaZ12 分钟前
【day53】
开发语言·c++·算法
历程里程碑12 分钟前
36 Linux线程池实战:日志与策略模式解析
开发语言·数据结构·数据库·c++·算法·leetcode·哈希算法
Coder_Boy_17 分钟前
分布式系统“三高”与数据一致性核心实践(基于实操梳理)
java·jvm·spring boot·分布式·微服务·性能优化
haiyaoyouyou18 分钟前
Qt ElaWidgetTools 编译运行示例
开发语言·qt·qt creator·elaframework·mingw_64