• Stream流中的常用方法(forEach,filter,map,count,limit,skip,concat)和Stream流的特点


     1、forEach方法

    • 该方法接收一个Consumer接口是一个 消费型 的函数式接口,可以传递Lambda表达式,消费数据
    • 用来遍历流中的数据,是一个 终结 方法,遍历 之后就不能继续调用Stream流中的其他方法
    1. package com.csdn.stream;
    2. import java.util.function.Consumer;
    3. import java.util.stream.Stream;
    4. public class Demo02Stream_forEach {
    5. public static void main(String[] args) {
    6. //获取一个Stream流
    7. Stream stream = Stream.of("小明", "小兰", "小强");
    8. // stream.forEach(new Consumer() {
    9. // @Override
    10. // public void accept(String s) {
    11. // System.out.println(s);
    12. // }
    13. // });
    14. // stream.forEach(name -> System.out.println(name));
    15. stream.forEach(System.out::println);//小明 小兰 小强
    16. }
    17. }

    2、 filter方法

    • 用于对Stream流中的数据进行 过滤 ,方法的参数Predicate是一个函数式接口,所以可以传递Lambda表达式,对数据进行过滤
    1. package com.csdn.stream;
    2. import java.util.function.Consumer;
    3. import java.util.function.Predicate;
    4. import java.util.stream.Stream;
    5. public class Demo03Stream_filter {
    6. public static void main(String[] args) {
    7. Stream stream = Stream.of("张三丰", "张翠山", "张无忌", "赵敏", "周芷若");
    8. // stream.filter(new Predicate() {
    9. // @Override
    10. // public boolean test(String s) {
    11. // return s.startsWith("张");
    12. // }
    13. // }).forEach(new Consumer() {
    14. // @Override
    15. // public void accept(String s) {
    16. // System.out.println(s);
    17. // }
    18. // });
    19. // Stream stream2 = stream.filter(name -> name.startsWith("张"));
    20. // stream2.forEach(System.out::println);
    21. // stream.filter(name->name.startsWith("张")).forEach(name-> System.out.println(name));
    22. stream.filter(name -> name.startsWith("张")).forEach(System.out::println);
    23. // 张三丰
    24. // 张翠山
    25. // 张无忌
    26. }
    27. }

    3、Stream流的特点 

    • 只能使用一次,Stream流属于管道流,只能被消费(使用)一次,第一个Stream流调用完毕方法,数据就会流转到下一个Stream上,而这时第一个Stream流已经使用完毕,就会关闭了,所以第一个Stream流就不能再调用方法了
    1. package com.csdn.stream;
    2. import java.util.function.Consumer;
    3. import java.util.function.Predicate;
    4. import java.util.stream.Stream;
    5. public class Demo03Stream_filter {
    6. public static void main(String[] args) {
    7. Stream stream = Stream.of("张三丰", "张翠山", "张无忌", "赵敏", "周芷若");
    8. Stream stream2 = stream.filter(name -> name.startsWith("张"));
    9. stream2.forEach(System.out::println);//张三丰 张翠山 张无忌
    10. //遍历Stream流
    11. stream.forEach(System.out::println);//IllegalStateException
    12. }
    13. }
    14. D:\Java\jdk-17\bin\java.exe
    15. 张三丰
    16. 张翠山
    17. 张无忌
    18. Exception in thread "main" java.lang.IllegalStateException: stream has already been operated upon or closed
    19. at java.base/java.util.stream.AbstractPipeline.sourceStageSpliterator(AbstractPipeline.java:279)
    20. at java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:762)
    21. at com.csdn.stream.Demo03Stream_filter.main(Demo03Stream_filter.java:16)

    4、map方法 

    • 如果需要将流中的元素映射到另一个流中,可以使用map方法,该接口需要一个Function函数式接口,可以将当前流中的 T 类型数据转换为另一种 R 类型的流
    1. package com.csdn.stream;
    2. import java.util.function.Consumer;
    3. import java.util.function.Function;
    4. import java.util.stream.Stream;
    5. public class Demo04Stream_map {
    6. public static void main(String[] args) {
    7. //获取一个String类型的Stream流
    8. Stream stringStream = Stream.of("1", "2", "3", "4", "5");
    9. // Stream integerStream = stringStream.map(new Function() {
    10. // @Override
    11. // public Integer apply(String s) {
    12. // return Integer.parseInt(s);
    13. // }
    14. // });
    15. // integerStream.forEach(new Consumer() {
    16. // @Override
    17. // public void accept(Integer integer) {
    18. // System.out.println(integer);
    19. // }
    20. // });
    21. //使用map方法,把字符串类型的整数,转换(映射)为Integer类型的整数
    22. Stream integerStream = stringStream.map(Integer::parseInt);
    23. //遍历integerStream流
    24. integerStream.forEach(System.out::println);//1 2 3 4 5
    25. }
    26. }

     5、count方法

    • 用于统计Stream流中 元素的个数 ,是一个 终结方法 ,返回值是一个long类型的整数,所以不能再继续调用Stream流中的其他方法了
    1. package com.csdn.stream;
    2. import java.util.ArrayList;
    3. import java.util.Collections;
    4. import java.util.List;
    5. import java.util.stream.Stream;
    6. public class Demo05Stream_count {
    7. public static void main(String[] args) {
    8. List list = new ArrayList<>();
    9. Collections.addAll(list, "1", "2", "3", "4", "5");
    10. Stream stream = list.stream();
    11. System.out.println(stream.count());//5
    12. }
    13. }

    6、limit方法

    • 用于 截取 流中的元素,limit方法可以对流进行截取,只取用前 n 个,参数是一个long型,如果集合当前长度大于参数则进行截取,否则不进行操作
    • limit方法是一个 延迟方法 ,只是对流中的元素进行截取,返回的是一个新的流,所以可以继续调用Stream流中的其他方法
    1. package com.csdn.stream;
    2. import java.util.stream.Stream;
    3. public class Demo06Stream_limit {
    4. public static void main(String[] args) {
    5. String[] arr = {"喜羊羊", "美羊羊", "懒洋洋", "灰太狼", "红太狼"};
    6. //获取一个Stream流
    7. Stream arr1 = Stream.of(arr);
    8. //使用limit对Stream流中的元素进行截取,只要前3个元素
    9. Stream limit = arr1.limit(3);
    10. //遍历limit流
    11. limit.forEach(System.out::println);//喜羊羊 美羊羊 懒洋洋
    12. }
    13. }

     7、skip方法

    • skip用于 跳过 元素,如果希望 跳过前几个元素,可以使用skip方法获取一个截取之后的新流,如果流的当前长度大于 n ,则跳过前 n 个;否则将会得到一个长度为 0 的空流
    1. package com.csdn.stream;
    2. import java.util.stream.Stream;
    3. public class Demo07Stream_skip {
    4. public static void main(String[] args) {
    5. String[] arr = new String[]{"喜羊羊", "美羊羊", "懒洋洋", "灰太狼", "红太狼"};
    6. //获取一个Stream流
    7. Stream arr1 = Stream.of(arr);
    8. //使用skip方法跳过前3个元素
    9. Stream skip = arr1.skip(3);
    10. //遍历skip流
    11. skip.forEach(System.out::println);//灰太狼 红太狼
    12. }
    13. }

     8、concat方法(concatenate)

    • 用于把流 组合 到一起,如果有两个流,希望合并成为一个流,那么可以使用Stream接口的静态方法concat
    1. package com.csdn.stream;
    2. import java.util.stream.Stream;
    3. public class Demo08Stream_concat {
    4. public static void main(String[] args) {
    5. String[] arr = {"喜羊羊", "美羊羊", "懒洋洋", "灰太狼", "红太狼"};
    6. //创建一个Stream流
    7. Stream arr1 = Stream.of(arr);
    8. //获取一个Stream流
    9. Stream arr2 = Stream.of("张三丰", "张翠山", "张无忌", "赵敏", "周芷若");
    10. //把以上两个流组合为一个流
    11. Stream concatenate = Stream.concat(arr1, arr2);
    12. //遍历concatenate流
    13. concatenate.forEach(System.out::println);// 喜羊羊 美羊羊 懒洋洋 灰太狼 红太狼 张三丰 张翠山 张无忌 赵敏 周芷若
    14. }
    15. }

     Stream流的练习

    • 现在有两个ArrayList集合,分别存储 倚天屠龙记人物 名称和 喜羊羊与灰太狼人物 名称,要求完成如下的操作
    1. 倚天屠龙记人物 只要名字为3个字的前3人
    2. 喜羊羊与灰太狼人物只要姓懒的,并且不要 第 1 个
    3. 把过滤后的倚天屠龙记人物 和 喜羊羊与灰太狼人物 合并到一起
    4. 把上一步操作后的元素作为构造方法的参数创建演员对象,遍历数据
    1. package com.csdn.Stream2;
    2. import lombok.AllArgsConstructor;
    3. import lombok.Data;
    4. import lombok.NoArgsConstructor;
    5. import java.util.ArrayList;
    6. import java.util.Collections;
    7. import java.util.function.Function;
    8. import java.util.stream.Stream;
    9. public class StreamPractice {
    10. public static void main(String[] args) {
    11. ArrayList list = new ArrayList<>();
    12. Collections.addAll(list, "张三丰", "张翠山", "张无忌", "赵敏","周芷若");
    13. ArrayList list2 = new ArrayList<>();
    14. Collections.addAll(list2, "喜羊羊", "美羊羊", "懒洋洋", "灰太狼","红太狼");
    15. /*
    16. //倚天屠龙记人物 只要名字为3个字的前3人
    17. Stream limit = list.stream().filter(s -> s.length() == 3).limit(3);
    18. //喜羊羊与灰太狼人物只要姓懒的,并且不要 第 1 个
    19. Stream skip = list2.stream().filter(s->s.startsWith("懒")).skip(1);
    20. //把过滤后的倚天屠龙记人物 和 喜羊羊与灰太狼人物 合并到一起
    21. Stream concatenate = Stream.concat(limit, skip);
    22. //把上一步操作后的元素作为构造方法的参数创建演员对象,遍历数据
    23. // concatenate.map(new Function() {
    24. // @Override
    25. // public Actor apply(String s) {
    26. // return new Actor(s);
    27. // }
    28. // }).forEach(System.out::println);
    29. concatenate.map(Actor::new).forEach(System.out::println);
    30. */
    31. Stream.concat(list.stream().filter(s -> s.length() == 3).limit(3),
    32. list2.stream().filter(s -> s.startsWith("懒")).skip(1)).
    33. map(Actor::new).forEach(System.out::println);
    34. // Actor(name=张三丰)
    35. // Actor(name=张翠山)
    36. // Actor(name=张无忌)
    37. }
    38. }
    39. @Data
    40. @NoArgsConstructor
    41. @AllArgsConstructor
    42. class Actor {
    43. private String name;
    44. }

  • 相关阅读:
    计算机毕业设计Java百姓点评网的设计与实现(源码+系统+mysql数据库+lw文档)
    ALTERA FPGA IPCORE核之FIFO详细教程
    城市排水监测方案(dtu终端配合工业路由器精准监测)
    阿里云docker容器服务器安装nextcloud步骤
    跨时钟域问题(三)异步FIFO的Verilog实现(格雷码)
    windows 开启ssh服务器
    【历史上的今天】9 月 14 日:中国第一封电子邮件;世界上最早的电子银行系统;微软发布 Windows Me
    springboot+人事信息管理系统 毕业设计-附源码221507
    信息时代下,法律行业如何进行互联网推广
    WordPress Page Builder KingComposer 2.9.6 Open Redirection
  • 原文地址:https://blog.csdn.net/m0_65152767/article/details/133829358