Stream流概述

image.png
Stream流能够简化数组和集合操作

举一个案例:体验一下Stream流
image.png

  1. package com.key.d17_packeg_01.Steam;
  2. import java.util.ArrayList;
  3. import java.util.Collections;
  4. import java.util.List;
  5. public class test {
  6. /**
  7. * 体验Steam流编程,简化集合和数组
  8. * @param args
  9. */
  10. public static void main(String[] args) {
  11. List<String> namelist = new ArrayList<>();
  12. Collections.addAll(namelist,"张无忌","张三丰","周芷若","灭绝师太","张强","谢逊");
  13. System.out.println(namelist);
  14. //1、从集合中找出姓张的,放到新的集合中
  15. List<String> zhanglist = new ArrayList<>();
  16. for (String name : namelist) {
  17. //System.out.println(name);
  18. if (name.startsWith("张")){
  19. zhanglist.add(name);
  20. }
  21. }
  22. System.out.println(zhanglist);
  23. //2、从集合中找出名字为3个字的,放到新集合中
  24. List<String> countlist = new ArrayList<>();
  25. for (String countname : namelist) {
  26. if (countname.length() == 3){
  27. countlist.add(countname);
  28. }
  29. }
  30. System.out.println(countlist);
  31. /**
  32. * 使用Steam流实现上面的代码
  33. */
  34. /*
  35. namelist.stream().filter(s -> s.startsWith("张")).filter(s -> s.length() == 3);
  36. Steam流可以支持链式编程,可以通过filter拼接过滤条件
  37. filter()就是过滤函数,在filter()中加上条件即可
  38. */
  39. namelist.stream().filter(s -> s.startsWith("张") && s.length() == 3).forEach(s -> System.out.println(s));
  40. }
  41. }

image.png

Stream流的核心思想

image.png

Stream流的三类方法

image.png

Stream流的获取

image.png

  1. package com.key.d17_packeg_01.Steam;
  2. import java.util.*;
  3. import java.util.stream.Stream;
  4. public class GetSteam {
  5. public static void main(String[] args) {
  6. /*
  7. Collection集合获取Steam流
  8. */
  9. Collection<String> list = new ArrayList<>();
  10. Stream<String> s = list.stream();
  11. /*
  12. Map集合获取Steam流
  13. */
  14. Map<String,Integer> list1 = new HashMap<>();
  15. //Map集合调用Stream流时,需要将键和值分开取Stream
  16. //取键流
  17. Stream<String> key = list1.keySet().stream();
  18. //取值流
  19. Stream<Integer> value = list1.values().stream();
  20. //取键值对流
  21. Stream<Map.Entry<String,Integer>> mapStream = list1.entrySet().stream();
  22. /*
  23. 数组取Stream流
  24. */
  25. String[] arr = {"张三","李四","王五"};
  26. Stream<String> name = Arrays.stream(arr);
  27. Stream<String> name1 = Stream.of(arr);
  28. }
  29. }

Steam流的常用API

image.png

  1. package com.key.d17_packeg_01.Steam;
  2. import java.util.ArrayList;
  3. import java.util.Collections;
  4. import java.util.List;
  5. import java.util.stream.Stream;
  6. public class StreamAPI {
  7. public static void main(String[] args) {
  8. List<String> name = new ArrayList<>();
  9. Collections.addAll(name,"张艺兴","周琼洁","宋轶","郭麒麟","于谦");
  10. System.out.println(name);
  11. //取前两个名字为三个字的明星
  12. name.stream().filter(s -> s.length() == 3).limit(2).forEach(s -> System.out.println(s));
  13. //另一种写法,替换s -> System.out.println(s);前提:入参一样,这里都传入了s
  14. // name.stream().filter(s -> s.length() == 3).limit(2).forEach(System.out::println);
  15. //跳过前两个名字为三个数字的明星,输出剩下的名字为三个字的明星
  16. System.out.println("----------");
  17. name.stream().filter(s -> s.length() == 3).skip(2).forEach(s -> System.out.println(s));
  18. System.out.println("----------");
  19. /*
  20. map()加工方法:给每个元素前加上固定值
  21. 这里map用了重写方法
  22. */
  23. name.stream().map(s -> "唱歌的" + s).forEach(s -> System.out.println(s));
  24. System.out.println("----------");
  25. //合并流
  26. Stream<String> s1 = name.stream().filter(s -> s.startsWith("周"));
  27. Stream<String> s2 = Stream.of("java1","java2");
  28. Stream<String> s3 = Stream.concat(s1,s2); //合并s1和s2两个Stream流
  29. s3.forEach(s -> System.out.println(s));
  30. }
  31. }

image.png

Stream流的综合应用案例

image.png

收集Stream流

image.png
image.png

  1. package com.key.d17_packeg_01.Steam;
  2. import java.util.ArrayList;
  3. import java.util.Collections;
  4. import java.util.List;
  5. import java.util.stream.Collectors;
  6. import java.util.stream.Stream;
  7. public class StreamDemo {
  8. public static void main(String[] args) {
  9. List<String> namelist = new ArrayList<>();
  10. Collections.addAll(namelist,"张艺兴","周琼洁","宋轶","郭麒麟","于谦","周冬雨","张鹤伦");
  11. Stream<String> zhouname = namelist.stream().filter(s -> s.startsWith("周")); //提取namelist中姓周的明星
  12. //把姓周的明星收集到集合中去
  13. List<String> zhoulist = zhouname.collect(Collectors.toList());
  14. System.out.println(zhoulist);
  15. }
  16. }

image.png