Stream流终结操作方法、收集操作及Stream综合练习

野性酷女 2024-04-06 10:18 192阅读 0赞

目录

一、Stream流终结操作方法

二、Stream流的收集操作

三、Stream流综合练习


一、Stream流终结操作方法

概念:终结操作的意思,就是执行完此方法之后,Stream流将不能再执行其他操作

常见方法:
















方法名 说明
void forEach(Consume action) 对此流的每个元素执行操作
long count() 返回此流中的元素数

代码演示:

  1. public class StreamDemo {
  2. public static void main(String[] args) {
  3. //创建一个集合,存储多个字符串元素
  4. ArrayList<String> list = new ArrayList<String>();
  5. list.add("林值瓦");
  6. list.add("张无极");
  7. list.add("王天涯");
  8. list.add("柳梅");
  9. list.add("张望");
  10. list.add("张启天");
  11. //需求1:把集合中的元素在控制台输出
  12. list.stream().forEach(System.out::println);
  13. //需求2:统计集合中有几个以张开头的元素,并把统计结果在控制台输出
  14. long count = list.stream().filter(s -> s.startsWith("张")).count();
  15. System.out.println(count);
  16. }
  17. }

二、Stream流的收集操作

概念:对数据使用Stream流的方式操作完毕后,可以把流中的数据收集到集合中

常用方法:












方法名 说明
R collect(Collector collector) 把结果收集到集合中

工具类Collectors提供了具体的收集方式:




















方法名 说明
public static Collector toList() 把元素收集到List集合中
public static Collector toSet() 把元素收集到Set集合中
public static Collector toMap(Function keyMapper,Function valueMapper) 把元素收集到Map集合中

代码演示:

  1. public class CollectDemo {
  2. public static void main(String[] args) {
  3. //创建List集合对象
  4. List<String> list = new ArrayList<String>();
  5. list.add("孙悟空");
  6. list.add("孙行者");
  7. list.add("王宝强");
  8. list.add("柳神");
  9. //需求1:得到名字为3个字的流
  10. Stream<String> listStream = list.stream().filter(s -> s.length() == 3);
  11. //需求2:把使用Stream流操作完毕的数据收集到List集合中并遍历
  12. List<String> names = listStream.collect(Collectors.toList());
  13. for(String name : names) {
  14. System.out.println(name);
  15. }
  16. //创建Set集合对象
  17. Set<Integer> set = new HashSet<Integer>();
  18. set.add(10);
  19. set.add(20);
  20. set.add(30);
  21. set.add(33);
  22. set.add(35);
  23. //需求3:得到年龄大于25的流
  24. Stream<Integer> setStream = set.stream().filter(age -> age > 25);
  25. //需求4:把使用Stream流操作完毕的数据收集到Set集合中并遍历
  26. Set<Integer> ages = setStream.collect(Collectors.toSet());
  27. for(Integer age : ages) {
  28. System.out.println(age);
  29. }
  30. //定义一个字符串数组,每一个字符串数据由姓名数据和年龄数据组合而成
  31. String[] strArray = {"孙悟空,560", "孙行者,555", "王宝强,33", "柳神,22"};
  32. //需求5:得到字符串中年龄数据大于28的流
  33. Stream<String> arrayStream = Stream.of(strArray).filter(s -> Integer.parseInt(s.split(",")[1]) > 28);
  34. //需求6:把使用Stream流操作完毕的数据收集到Map集合中并遍历,字符串中的姓名作键,年龄作值
  35. Map<String, Integer> map = arrayStream.collect(Collectors.toMap(s -> s.split(",")[0], s -> Integer.parseInt(s.split(",")[1])));
  36. Set<String> keySet = map.keySet();
  37. for (String key : keySet) {
  38. Integer value = map.get(key);
  39. System.out.println(key + "," + value);
  40. }
  41. }
  42. }

三、Stream流综合练习

需求:

现在有两个ArrayList集合,分别存储6名男演员名称和6名女演员名称,要求完成如下操作:

男演员只要名字为3个字的前三人

女演员只要姓林的,并且不要第一个

把过滤后的男演员姓名和女演员姓名合并到一起

把上一步操作后的元素作为构造方法的参数创建演员对象,遍历数据

代码实现:

  1. public class Actor {
  2. private String name;
  3. public Actor(String name) {
  4. this.name = name;
  5. }
  6. public String getName() {
  7. return name;
  8. }
  9. public void setName(String name) {
  10. this.name = name;
  11. }
  12. }
  13. public class StreamTest {
  14. public static void main(String[] args) {
  15. //创建集合
  16. ArrayList<String> manList = new ArrayList<String>();
  17. manList.add("周润发");
  18. manList.add("成龙");
  19. manList.add("刘德华");
  20. manList.add("吴京");
  21. manList.add("周星驰");
  22. manList.add("李连杰");
  23. ArrayList<String> womanList = new ArrayList<String>();
  24. womanList.add("林心如");
  25. womanList.add("张曼玉");
  26. womanList.add("林青霞");
  27. womanList.add("柳岩");
  28. womanList.add("林志玲");
  29. womanList.add("王祖贤");
  30. //男演员只要名字为3个字的前三人
  31. Stream<String> manStream = manList.stream().filter(s -> s.length() == 3).limit(3);
  32. //女演员只要姓林的,并且不要第一个
  33. Stream<String> womanStream = womanList.stream().filter(s -> s.startsWith("林")).skip(1);
  34. //把过滤后的男演员姓名和女演员姓名合并到一起
  35. Stream<String> stream = Stream.concat(manStream, womanStream);
  36. //把上一步操作后的元素作为构造方法的参数创建演员对象,遍历数据
  37. // stream.map(Actor::new).forEach(System.out::println);
  38. stream.map(Actor::new).forEach(p -> System.out.println(p.getName()));
  39. //把以上操作联合在一起
  40. Stream.concat(manList.stream().filter(s -> s.length() == 3).limit(3), womanList
  41. .stream().filter(s -> s.startsWith("林")).skip(1)).map(Actor::new)
  42. .forEach(p -> System.out.println(p.getName()));
  43. }
  44. }

发表评论

表情:
评论列表 (有 0 条评论,192人围观)

还没有评论,来说两句吧...

相关阅读