当前位置:   article > 正文

java中stream流_java stream流

java stream流

stream流作用:

结合Lambda表达式,简化集合、数组操作

stream流使用步骤:

1、先获取Stream流(流水线),并把数据放上去

2、使用Stream流中的api进行各种操作

中间方法:过滤、打印    ===>方法调用完毕,还可以调用其它方法

终结方法:统计、打印    ===>最后一步,调用完毕,不能调用其他方法

stream流获取方式:

单列集合  使用Collection中默认方法
双列  集合无法直接使用stream流,先转换为entrySet,再使用流
数组     Arrays工具类中静态方法
零散数据只能打印引用数据类
  1. /**
  2. * 单列集合 default stream<E> stream() 使用Collection中默认的方法
  3. */
  4. ArrayList<Integer> list = new ArrayList<Integer>();
  5. Collections.addAll(list,10,20,30,40,50);
  6. //1.获取stream流
  7. Stream<Integer> stream = list.stream();
  8. //2.使用中间方法处理流数据
  9. //方式1:匿名内部类方式
  10. stream.forEach(new Consumer<Integer>() {
  11. @Override
  12. public void accept(Integer integer) {
  13. //3.使用终结方法结束stream流
  14. System.out.println(integer);
  15. }
  16. });
  17. //方式2:lambda方式
  18. stream.forEach(s-> System.out.println(s));
  1. /**
  2. * 双列集合 无 无法直接使用stream流
  3. */
  4. Map<String,Integer> students =new HashMap<String,Integer>();
  5. students.put("小红",20);
  6. students.put("小张",30);
  7. students.put("小李",40);
  8. //获取key的stream流
  9. Set<String> set = students.keySet();
  10. Stream<String> keys= set.stream();
  11. //lambda方式,打印key
  12. keys.forEach(key -> System.out.println(key));
  13. //获取entrySet的stream流
  14. Set<Map.Entry<String, Integer>> stus = students.entrySet();
  15. //lambda方式,打印entrySet
  16. stus.forEach(stu-> System.out.println(stu));
  17. }
  1. /**
  2. * 数组 public static<T> Stream<T> stream(T[] array) Arrays工具类中的静态方法
  3. */
  4. public static void main(String[] args) {
  5. int[] arrs1={10,20,30,40,50,60};
  6. //lambda遍历基本类型数组
  7. Arrays.stream(arrs1).forEach(num -> System.out.println(num));
  8. String[] arrs2={"10","20","30","40","50","60"};
  9. //lambda遍历引用类型数组
  10. Arrays.stream(arrs2).forEach(num -> System.out.println(num));
  11. }
  1. /**
  2. * 一堆零散数据 public static<T> Stream<T> of(T...values) stream接口中静态方法
  3. */
  4. int[] nums={10,20,30,40};
  5. String[] strings={"10","20","30"};
  6. //零散数据方式,只能打印引用类型数据,打印基本类型数据是整个对象地址
  7. Stream.of(nums).forEach(num-> System.out.println(num));//打印[I@404b9385,无法正确预期打印结果,
  8. Stream.of(strings).forEach(str-> System.out.println(str));

Stream流中间方法: 

filter过滤
limit 获取前几个元素
skip    跳过前几个元素
distinct    元素去重,依赖hashCode和equals方法
concat  Stream接口的静态方法,合并a和b两个流为一个流
map  转换流中的数据类型
  1. ArrayList<String> arrayList = new ArrayList<>();
  2. Collections.addAll(arrayList,"张三丰","张无忌","张三","李四","李天","王五");
  3. //1、filter 过滤
  4. arrayList.stream()//获取stream流
  5. .filter(s -> s.length()==3 && s.startsWith("张"))//中间方法,设置条件,过滤流
  6. .forEach(arr -> System.out.println(arr)); //终结方法,打印流
  7. System.out.println("--------------------");
  8. //2、limit 获取前几个元素
  9. arrayList.stream()
  10. .limit(3)
  11. .forEach(arr-> System.out.println(arr));
  12. System.out.println("--------------------");
  13. //3、skip 跳过前几个元素
  14. arrayList.stream()
  15. .skip(3)
  16. .forEach(arr -> System.out.println(arr));
  1. ArrayList<String> arrayList = new ArrayList<>();
  2. Collections.addAll(arrayList,"张三丰","张三丰","张无忌","张无忌","张三","李四","李天","王五");
  3. //1、distinct 元素去重,依赖hashCode和equals方法
  4. arrayList.stream()
  5. .distinct()
  6. .forEach(arr-> System.out.println(arr));
  7. System.out.println("--------------------");
  8. //2、concat Stream流中的静态方法,合并a和b两个流为一个流
  9. Stream.concat(
  10. arrayList.stream(),arrayList.stream() //自动去重
  11. );
  1. ArrayList<String> arrayList = new ArrayList<>();
  2. Collections.addAll(arrayList,"张三丰-20","张无忌-30","张三-30","李四-40","李天-50","王五-25");
  3. //map 转换流中的数据类型
  4. //1、匿名内部类方式
  5. arrayList.stream()
  6. .map(new Function<String, Integer>() {
  7. @Override
  8. public Integer apply(String s) {
  9. //将每个元素用"-"分割
  10. String[] strings = s.split("-");
  11. //取出年龄元素
  12. String ageString = strings[1];
  13. Integer age = Integer.valueOf(ageString);
  14. return age;
  15. }
  16. }).forEach(arr -> System.out.println(arr));
  17. //2、lambda方式
  18. arrayList.stream() //获取流
  19. .map(s ->"name:"+s.split("-")[0]+",value:"+s.split("-")[0]) //中间方法,处理流
  20. .forEach(arr -> System.out.println(arr)); //终结方法,打印流
  21. }

Stream流结束方法:

foreEach                遍历
cout统计                
toArray将流中的数据保存在数组中
  1. /**
  2. * 结束Stream流:forEach、count、toArray
  3. */
  4. ArrayList<String> arrayList = new ArrayList<>();
  5. Collections.addAll(arrayList,"张三丰","张无忌","张三","李四","李天","王五");
  6. //1、forEach
  7. //方式1:匿名内部类
  8. arrayList.stream().forEach(new Consumer<String>() {
  9. @Override
  10. public void accept(String s) {
  11. System.out.println(s);
  12. }
  13. });
  14. //方式2:lambda方式
  15. arrayList.forEach(s -> System.out.println(s));
  16. //2、count
  17. long length = arrayList.stream().count();
  18. System.out.println(length);
  19. //3、toArray 收集流中的数据放到数组中
  20. Object[] objects = arrayList.stream().toArray();
  21. System.out.println(Arrays.toString(objects));
  22. //将string类型集合存放到,string类型数组中存储
  23. //方式1:匿名内部类
  24. String[] arr1 = arrayList.stream().toArray(new IntFunction<String[]>() {//泛型:存储数组的类型
  25. @Override
  26. public String[] apply(int value) {//返回类型:存储数组的类型 形参:集合长度
  27. return new String[value]; //返回参数:集合长度数组
  28. }
  29. });
  30. System.out.println(Arrays.toString(arr1));
  31. //方式2:lambda方式
  32. String[] arr2 = arrayList.stream().toArray((value) -> new String[value]);
  33. System.out.println(Arrays.toString(arr2));
  34. }

 集合收集方法collect:

 collect

收集流中的数据,存放到集合中(List、Set、Map)

注:map集合中的键不能重复,否则会报错

  1. ArrayList<String> list = new ArrayList<>();
  2. Collections.addAll(list,
  3. "张无忌-男-15","周芷若-女-14","赵敏-女-13",
  4. "张强-男-20","张三丰-男-100","张翠山-男-40",
  5. "张良-男-35","王二麻子-男-37","谢广坤-男-41");
  6. //将男性,存入到List集合中(有序可重复)
  7. List<String> list1 = list.stream()
  8. .filter(s -> "男".equals(s.split("-")[1]))
  9. .collect(Collectors.toList());
  10. System.out.println(list1);
  1. //将男性,存入到Set集合中(无序不重复)
  2. Set<String> list2 = list.stream()
  3. .filter(s -> "男".equals(s.split("-")[1]))
  4. .collect(Collectors.toSet());
  5. System.out.println(list2);
  1. //将男性,存入到Map集合中
  2. //匿名内部类方式:
  3. Map<String, Integer> map1 = list.stream()
  4. .filter(s -> "男".equals(s.split("-")[1]))
  5. .collect(
  6. Collectors.toMap(
  7. //参数1:key的生成规则
  8. new Function<String, String>() { //泛型1:流中每个数据的类型 泛型2:map集合中key的数值类型
  9. @Override
  10. public String apply(String s) {//形参:流中每个数据类型
  11. return s.split("-")[0];//方法体:生成key的代码 返回值:生成的key
  12. }
  13. },
  14. //参数2:value的生成规则
  15. new Function<String, Integer>() { //泛型1:流中每个数据的类型 泛型2:map集合中value的数值类型
  16. @Override
  17. public Integer apply(String s) {//形参:流中每个数据类型
  18. return Integer.valueOf(s.split("-")[2]);//方法体:生成value的代码 返回值:生成的value
  19. }
  20. }
  21. ));
  22. System.out.println(map1);
  23. //lambda方式:
  24. Map<String, String> map2 =
  25. list.stream()
  26. .filter(s -> "男".equals(s.split("-")[1]))
  27. .collect(Collectors.toMap(s -> s.split("-")[0], s -> s.split("-")[2]));
  28. System.out.println(map2);

 封装Stream流数据为JavaBean,并存入List集合中:

封装Bean过程:先使用map转换流分割数据,再封装到Bean中,最后转为List集合

  1. ArrayList<String> womanList = new ArrayList<>();
  2. ArrayList<String> manList = new ArrayList<>();
  3. Collections.addAll(manList,"蔡坤坤,24","叶猴先,23","刘部天,22","吴倩,24","骨架,30","小萝莉,27");
  4. Collections.addAll(womanList,"赵小应,24","杨颖,36","高圆圆,43","张甜甜,32","刘诗诗,35","杨小米,33");
  5. //1、过滤出姓名长度为3的前两位男演员
  6. Stream<String> manStream = manList.stream()
  7. .filter(s -> s.split(",")[0].length() == 3)
  8. .limit(2);
  9. //2、过滤出跳过第1位为姓杨的女演员
  10. Stream<String> womanStream = womanList.stream()
  11. .filter(s -> s.split(",")[0].startsWith("杨"))
  12. .skip(1);
  13. //3、合并两个stream流
  14. Stream<String> stream = Stream.concat(manStream, womanStream);
  15. //4、将流中的数据封装成Actor对象,存入List集合中
  16. List<Actor> actors =
  17. stream.map(s -> new Actor( //使用map转换流,分隔字符串,并封装javaBean中
  18. s.split(",")[0],
  19. Integer.valueOf(s.split(",")[1]
  20. )))
  21. .collect(Collectors.toList());
  22. for (Actor actor : actors) {
  23. System.out.println(actor);
  24. }
  1. List<Actor> actors = //使用map转换流,分隔字符串,并封装javaBean中
  2. stream.map(s ->
  3. {
  4. Actor actor = new Actor();
  5. actor.setName(s.split(",")[0]);
  6. actor.setAge(Integer.valueOf(s.split(",")[1]));
  7. return actor;
  8. }).collect(Collectors.toList());

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/92844
推荐阅读
相关标签
  

闽ICP备14008679号