当前位置:   article > 正文

Java的Stream流【详解】_java stream流

java stream流

        

目录

        

一.概念

二.Stream流处理数据的步骤

        1.得到集合或者数组的Stream流。

2.调用Stream流的中间方法对数据进行处理

3.调用Stream流的终结方法获取处理的结果

一.概念

        是Jdk8开始新增的一套API (java.util.stream.*),可以用于操作集合或者数组的数据。

好处:

       Stream流大量的结合了Lambda的语法风格来编程,提供了一种更加强大,更加简单的方式操作集合或者数组中的数据,代码更简洁,可读性更好。

二.Stream流处理数据的步骤

        1.得到集合或者数组的Stream流。

                获取集合对象的Stream流:default Stream<E> stream​()

                获取数组对象的Stream流:

                        Arrays类提供的静态方法 public static <T> Stream<T> stream(T[] array)

                        Stream类提供的静态方法   public static<T> Stream<T> of(T... values)

        

  1. package com.itheima.day08.teacher.stream;
  2. import java.util.*;
  3. import java.util.stream.Stream;
  4. public class StreamDemo01 {
  5. /*
  6. 掌握
  7. 如何获取 List的Stream流
  8. 如何获取 Set的Stream流
  9. 单列集合对象.stream()
  10. 如何获取 Map的Stream流
  11. 变成单列之后 在 .stream()
  12. 如果获取 数组的Stream流
  13. Arrays.stream(数组)
  14. Stream.of(数组)
  15. 将集合中的数据放到流水线上。
  16. */
  17. public static void main(String[] args) {
  18. //1 List的Stream流
  19. List<String> names = new ArrayList<>();
  20. Collections.addAll(names,"蔡徐坤","小黑子","ikun","鸡你太美");
  21. // 数据转换到流上
  22. Stream<String> stream1 = names.stream();
  23. //2 Set的Stream流
  24. Set<String> set = new HashSet<>();
  25. Collections.addAll(set,"蔡徐坤","小黑子","ikun","鸡你太美");
  26. // 数据转换到流上
  27. Stream<String> stream2 = names.stream();
  28. //3:如何获取 Map的Stream流
  29. Map<String,Integer> map = new HashMap<>();
  30. map.put("姚明",40);
  31. map.put("刘翔",42);
  32. map.put("郭敬明",44);
  33. // 键集 转换成Stream流
  34. Stream<String> stream31 = map.keySet().stream();
  35. // 值集 转换成Stream流
  36. Stream<Integer> stream32 = map.values().stream();
  37. //处理键值对呢? 键值对对象 叫entry
  38. Stream<Map.Entry<String, Integer>> stream3 = map.entrySet().stream();
  39. //4:数组 的Stream流
  40. String[] array = {"蔡徐坤","小黑子","ikun","鸡你太美"};
  41. //两种方式
  42. Stream<String> stream4 = Arrays.stream(array);
  43. Stream<String> stream5 = Stream.of(array);
  44. }
  45. }
2.调用Stream流的中间方法对数据进行处理

        中间方法调用完成后会返回新的Stream流,可以继续使用(支持链式编程)

  1. package com.itheima.day08.teacher.stream;
  2. import java.util.stream.Stream;
  3. public class StreamDemo02 {
  4. /*
  5. 学习Stream流的中间方法
  6. */
  7. public static void main(String[] args) {
  8. //将多个数据放到流水线上 形成新的Stream流
  9. Stream<String> stream1 = Stream.of("a", "b", "c", "d", "e", "f", "g");
  10. // limit(long n)流水线上取出前n个元素..形成一个新的流向 旧的流向已经关闭 (永不回头)
  11. // Stream<String> limit = stream1.limit(3);
  12. // forEach(写处理每个数据的lambda表达式)
  13. // lambda ()->{}
  14. System.out.println("=================limit 取前几个======================");
  15. stream1.limit(3).forEach(s-> System.out.println(s));
  16. // forEach() 终结方法 从流水线上下来了。
  17. //============================
  18. System.out.println("=================skip跳过======================");
  19. Stream<String> stream2 = Stream.of("a", "b", "c", "d", "e", "f", "g");
  20. //跳过
  21. stream2.skip(4).forEach(s -> System.out.println(s));
  22. System.out.println("=============distinct去重==========================");
  23. Stream<String> stream3 = Stream.of("a", "b", "a", "d", "b", "b", "g");
  24. //终结方法
  25. // System.out.println(stream3.count());
  26. // stream3.skip(3); 报错 原因 count()终结
  27. long count = stream3.distinct().count();
  28. System.out.println("去重之后还有几个数据:"+count);
  29. System.out.println("============sorted排序=================");
  30. Stream<Integer> stream4 = Stream.of(911,119,111,114,110);
  31. stream4.sorted().forEach(s-> System.out.println(s));//默认排序
  32. System.out.println("============sorted排序 自定义排序规则=================");
  33. Stream<Integer> stream5 = Stream.of(911,119,111,114,110);
  34. stream5.sorted((o1,o2)->o2-o1).forEach(s-> System.out.println(s));//默认排序
  35. }
  36. }
  37. ----------------
  38. package com.itheima.day08.teacher.stream;
  39. import java.util.ArrayList;
  40. import java.util.Collections;
  41. import java.util.List;
  42. import java.util.stream.Stream;
  43. public class StreamDemo03 {
  44. /*
  45. 学会使用Stream流的中间方法
  46. */
  47. public static void main(String[] args) {
  48. List<Double> scores = new ArrayList<>();
  49. Collections.addAll(scores, 88.5, 100.0, 50.0);
  50. // sorted 排序 排序的规则 两个数据比较 (o1,o2)->{比较的规则}
  51. // sorted((o1,o2)->{排序的规则}) sorted() 默认规则
  52. // forEach(完成数据的遍历) 每次取出来每一个元素
  53. // forEach((s)->{处理s})
  54. // filter是过滤的功能 找出符合要求的数据 返回的结果是boolean
  55. // filter((s)->{return 判断语句;})
  56. // filter(s->判断语句)
  57. // 找出成绩大于等于60分的数据,并升序后,再输出。
  58. scores.stream().filter(s->s>=60).sorted().forEach(System.out::println);
  59. // map 一一映射 转换的意思
  60. // 将流中的Double类型数据 变成字符串类型
  61. // Stream<Double> stream = scores.stream(); 流里面是 Double类型元素
  62. // map 将A 类型 转换成 B类型
  63. // Double---String
  64. // map((A s)->{return B类型;})
  65. // map(A类型参数->B类型数据)
  66. // Stream<String> stringStream = scores.stream().map((Double d) -> {
  67. // return d + "哈哈";
  68. // });
  69. Stream<String> stringStream = scores.stream().map( d -> d + "哈哈");
  70. // Double类型 变成学生类型
  71. // scores.stream().map((Double s)->{返回 学生对象})
  72. // Stream<Student> studentStream = scores.stream().map((Double s) -> {
  73. // return new Student("小明", 18, s);
  74. // });
  75. Stream<Student> studentStream = scores.stream().map( s-> new Student("小明", 18, s));
  76. //苍穹外卖 项目后期 可以使用map进行类型转换。
  77. //合并流
  78. Stream<String> stream1 = Stream.of("a", "b", "c");
  79. Stream<String> stream2 = Stream.of("1", "2", "3");
  80. Stream<String> stream = Stream.concat(stream1, stream2);
  81. //两个流合并到一个流上了。
  82. }
  83. }
3.调用Stream流的终结方法获取处理的结果

        终结方法调用完成后,不会返回新Stream了,不能继续使用流了

       

代码演示:

  1. package com.itheima.day08.teacher.stream;
  2. /**
  3. * 学生类
  4. */
  5. public class Student {
  6. private String name;
  7. private int age;
  8. private double score;
  9. public Student() {
  10. }
  11. public Student(String name, int age, double score) {
  12. this.name = name;
  13. this.age = age;
  14. this.score = score;
  15. }
  16. /**
  17. * 获取
  18. * @return name
  19. */
  20. public String getName() {
  21. return name;
  22. }
  23. /**
  24. * 设置
  25. * @param name
  26. */
  27. public void setName(String name) {
  28. this.name = name;
  29. }
  30. /**
  31. * 获取
  32. * @return age
  33. */
  34. public int getAge() {
  35. return age;
  36. }
  37. /**
  38. * 设置
  39. * @param age
  40. */
  41. public void setAge(int age) {
  42. this.age = age;
  43. }
  44. /**
  45. * 获取
  46. * @return score
  47. */
  48. public double getScore() {
  49. return score;
  50. }
  51. /**
  52. * 设置
  53. * @param score
  54. */
  55. public void setScore(double score) {
  56. this.score = score;
  57. }
  58. public String toString() {
  59. return "Student{name = " + name + ", age = " + age + ", score = " + score + "}";
  60. }
  61. }
  62. --------------
  63. package com.itheima.day08.teacher.stream;
  64. import java.util.ArrayList;
  65. import java.util.Collections;
  66. import java.util.List;
  67. import java.util.Optional;
  68. import java.util.stream.Stream;
  69. public class StreamDemo04 {
  70. /*
  71. 学会使用Stream流的终结方法
  72. */
  73. public static void main(String[] args) {
  74. List<Double> scores = new ArrayList<>();
  75. Collections.addAll(scores, 88.5, 100.0, 50.0);
  76. System.out.println(scores.stream().count());//求出该流中数据的个数
  77. scores.stream().forEach(s-> System.out.println(s));//对流中数据进行处理--输出
  78. System.out.println("===========求最大值==============");
  79. Double max = scores.stream().max((o1, o2) -> Double.compare(o2, o1)).get(); //按照正常前后顺序才能找到,翻过会找到最小值
  80. // Double max = scores.stream().max(Double::compare).get();
  81. Double min = scores.stream().min((o1, o2) -> Double.compare(o1, o2)).get();
  82. System.out.println(max);
  83. System.out.println(min);
  84. List<Student> students = new ArrayList<>();
  85. students.add(new Student("小明",28,1.67));
  86. students.add(new Student("小李",26,1.98));
  87. students.add(new Student("小王",27,1.99));
  88. //求出身高最高的哪位同志
  89. // Student student = students.stream().max((o1, o2) -> Double.compare(o1.getScore(), o2.getScore())).get();
  90. Student student = students.stream().max((o1, o2) -> Double.compare(o1.getScore(), o2.getScore())).get();
  91. System.out.println(student);
  92. }
  93. }
  94. ------------------
  95. package com.itheima.day08.teacher.stream;
  96. import java.util.ArrayList;
  97. import java.util.List;
  98. import java.util.stream.Collectors;
  99. public class StreamTest01 {
  100. public static void main(String[] args) {
  101. List<String> list = new ArrayList<>();
  102. list.add("张歆艺");
  103. list.add("周杰伦");
  104. list.add("赵雷");
  105. list.add("张译");
  106. list.add("张学友");
  107. //把集合中所有以 张开头 且3个字的元素存储到新的集合中
  108. List<String> newList = new ArrayList<>();
  109. for (String name : list) {
  110. if(name.startsWith("张") && name.length()==3){
  111. newList.add(name);
  112. }
  113. }
  114. System.out.println(newList);
  115. // 将集合数据放到流水线上 进行 一步步的操作
  116. List<String> newList2 = list.stream().filter(s -> s.startsWith("张")).filter(s -> s.length() == 3).collect(Collectors.toList());
  117. System.out.println(newList2);
  118. }
  119. }

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

闽ICP备14008679号