• JDK -- Stream使用


    目录

    Stream流的获取方式

    Collection接口(List & Set)

    Map接口

    数组

    中间方法

    filter过滤

     limit前几个元素

    Skip跳过前几个元素

    distinct去除重复元素 -- 依赖hashcode和equals方法

    max取最大值 

    Sort排序

     Map对数据进行加工

    contact 合并两个流为一个流

    总结方法

    forEach 遍历

    count 元素个数

    Collect 收集方法

    toList 

    toSet

    toMap


    JDK8 以后提供了Stream流来对集合进行处理,配合lambda表达式简化code,带来函数式编程

    Stream流的核心思想:

    1. 先得到集合或者数组的Stream流(就是一根传送带)
    2. 把元素放上去
    3. 然后就用这个Stream流简化的API来方便的操作元素

    Stream流可以分为三部分:

    1. 获取Stream流
      --创建一条流水线,并把数据放到流水线上准备进行操作
    2. 中间方法
      --流水线的操作,一次操作完毕后,还可以继续进行其他操作
    3. 终结方法
      --一个Stream流只能有一个终结方法,是流水线上的最后一个操作

    Stream流的获取方式

    Collection接口(List & Set)

    名称

    说明

    default Stream stream​()

    获取当前集合对象的Stream

    1. /** --------------------Collection集合获取流------------------------------- */
    2. Collection list = new ArrayList<>();
    3. Stream stream = list.stream();
    4. Collection set = new HashSet<>();
    5. Stream setStream = set.stream();

    Map接口

    1. /** --------------------Map集合获取流------------------------------- */
    2. Map maps = new HashMap<>();
    3. // 键流
    4. Stream keyStream = maps.keySet().stream();
    5. // 值流
    6. Stream valueStream = maps.values().stream();
    7. // 键值对流(拿整体)
    8. Stream> keyAndValueStream = maps.entrySet().stream();

    数组

    1. /** ---------------------数组获取流------------------------------ */
    2. String[] names = {"赵敏","小昭","灭绝","周芷若"};
    3. Stream nameStream = Arrays.stream(names);
    4. Stream nameStream2 = Stream.of(names);

    中间方法

    注意:

    l 中间方法也称为非终结方法,调用完成后返回新的 Stream 流可以继续使用,支持链式编程。
    l Stream 流中无法直接修改集合、数组中的数据。

    filter过滤

    名称

    说明

    Stream<T> filter(Predicatesuper T> predicate)

    用于对流中的数据进行过滤。

    1. List list = new ArrayList<>();
    2. Collections.addAll(list, "张无忌","周芷若","赵敏","张强","张三丰","张三丰");
    3. // Stream filter(Predicate predicate)
    4. list.stream().filter(s -> s.startsWith("张")).forEach(s -> System.out.println(s));
    5. long size = list.stream().filter(s -> s.length() == 3).count();
    6. System.out.println(size);

     limit前几个元素

    名称

    说明

    Stream limit​(long maxSize)

    获取前几个元素

    1. // list.stream().filter(s -> s.startsWith("张")).limit(2).forEach(s -> System.out.println(s));
    2. list.stream().filter(s -> s.startsWith("张")).limit(2).forEach(System.out::println);

    Skip跳过前几个元素

    名称

    说明

    Stream skip​(long n)

    跳过前几个元素

    list.stream().filter(s -> s.startsWith("张")).skip(2).forEach(System.out::println);
    

    distinct去除重复元素 -- 依赖hashcode和equals方法

    名称

    说明

    Stream distinct​()

    去除流中重复的元素。依赖(hashCodeequals方法)

    list.stream().filter(s -> s.startsWith("张")).distinct().forEach(s -> System.out.println(s));
    

    max取最大值 

    需要比较器 Comparator

    1. List one = new ArrayList<>();
    2. one.add(new Employee("猪八戒",'男',30000 , 25000, null));
    3. one.add(new Employee("孙悟空",'男',25000 , 1000, "顶撞上司"));
    4. one.add(new Employee("沙僧",'男',20000 , 20000, null));
    5. one.add(new Employee("小白龙",'男',20000 , 25000, null));
    6. Employee e = one.stream().max((e1, e2) -> Double.compare(e1.getSalary() + e1.getBonus(), e2.getSalary() + e2.getBonus())).get();

    Sort排序

    需要比较器 Comparator

    1. List one = new ArrayList<>();
    2. one.add(new Employee("猪八戒",'男',30000 , 25000, null));
    3. one.add(new Employee("孙悟空",'男',25000 , 1000, "顶撞上司"));
    4. one.add(new Employee("沙僧",'男',20000 , 20000, null));
    5. one.add(new Employee("小白龙",'男',20000 , 25000, null));
    6. one.stream().sorted((e1, e2) -> Double.compare(e1.getSalary() + e1.getBonus(), e2.getSalary() + e2.getBonus()))
    7. .forEach(s -> System.out.println(s));

     Map对数据进行加工

    参数为Function

    1. List list = new ArrayList<>();
    2. Collections.addAll(list, "张无忌","张三丰","赵敏","小昭","张强");
    3. list.stream().map(new Function() {
    4. @Override
    5. public String apply(String s) {
    6. return "黑马的:" + s;
    7. }
    8. }).forEach(System.out::println);
    9. //等同于上面, lambda简写格式
    10. list.stream().map(s -> "黑马的:" + s).forEach(a -> System.out.println(a));
    11. //相当于Function
    12. list.stream().map(s -> new Student(s)).forEach(s -> System.out.println(s));
    13. //上一行的简化格式
    14. list.stream().map(Student::new).forEach(System.out::println);

    contact 合并两个流为一个流

    名称

    说明

    static Stream concat​(Stream a, Stream b)

    合并ab两个流为一个流

    1. Stream s1 = list.stream().filter(s -> s.startsWith("张"));
    2. Stream s2 = Stream.of("java1", "java2");
    3. // public static Stream concat(Stream a, Stream b)
    4. Stream s3 = Stream.concat(s1 , s2);

    总结方法

    注意:终结操作方法,调用完成后流就无法继续使用了,原因是不会返回Stream了。

    forEach 遍历

    名称

    说明

    void forEach​(Consumer action)

    对此流的每个元素执行遍历操作

    1. List list = new ArrayList<>();
    2. Collections.addAll(list, "张无忌","周芷若","赵敏","张强","张三丰","张三丰");
    3. // Stream filter(Predicate predicate)
    4. list.stream().filter(s -> s.startsWith("张")).forEach(s -> System.out.println(s));

    count 元素个数

    名称

    说明

    long count​()

    返回此流中的元素数

    1. List list = new ArrayList<>();
    2. Collections.addAll(list, "张无忌","周芷若","赵敏","张强","张三丰","张三丰");
    3. long size = list.stream().filter(s -> s.length() == 3).count();
    4. System.out.println(size);

    Collect 收集方法

    toList 

    名称

    说明

    public static Collector toList​()

    把元素收集到List集合中

    1. List list = new ArrayList<>();
    2. Collections.addAll(list, "张无忌","周芷若","赵敏","张强","张三丰","张三丰");
    3. Stream s1 = list.stream().filter(s -> s.startsWith("张"));
    4. List zhangList = s1.collect(Collectors.toList()); // 可变集合

    toSet

    名称

    说明

    public static Collector toSet​()

    把元素收集到Set集合中

    1. List list = new ArrayList<>();
    2. Collections.addAll(list, "张无忌","周芷若","赵敏","张强","张三丰","张三丰");
    3. // 注意注意注意:“流只能使用一次”
    4. Set zhangSet = list.stream().filter(s -> s.startsWith("张"))
    5. .collect(Collectors.toSet());
    6. System.out.println(zhangSet);

    toMap

    名称

    说明

    public static Collector toMap​(Function keyMapper , Function valueMapper)

    把元素收集到Map集合中

     例如将List 转为 Map

    1. public static void main(String[] args) {
    2. List list = new ArrayList<>();
    3. Collections.addAll(list,
    4. new Student(1, "张三"),
    5. new Student(2, "李四"),
    6. new Student(1, "王五"));
    7. Map map =
    8. list.stream().collect(
    9. Collectors.toMap(Student::getId, Student::getName, (v1, v2) -> v1));
    10. System.out.println(map);
    11. }

    结果如下:

    {1=张三, 2=李四}

    toMap时只用到两个参数,第一个设定Key,第二个设定value。但如果Key重复的话,那就需要用到第三个参数,可以这么写(v1, v2)-> v1, 当key重复时使用之前的,如果是(v1,v2) -> v2,则表示覆盖

  • 相关阅读:
    学习笔记——数据结构与算法之美_极客时间
    Bootstrap的行、列布局设计(网络系统设计)
    wireshark测试tcp三次握手与四次挥手
    一次生产死锁问题的处理
    端口扫描技术
    Git(四)底层命令:git对象、树对象、提交对象
    StarRocks实战——欢聚集团极速的数据分析能力
    SQL 练习题目(入门级)
    Linux的打包和压缩
    yolov5 通过视频进行目标检测
  • 原文地址:https://blog.csdn.net/qq_33753147/article/details/127767185