1. package com.fly.stream;
    2. import java.security.SecureRandom;
    3. import java.util.*;
    4. import java.util.stream.Collectors;
    5. import java.util.stream.Stream;
    6. /**
    7. * Stream极大的简化了集合的操作,相比较Collection Stream用于处理集合之间的计算,是面向于CPU的,通过 * CPU实现计算,而Collection是一种静态的内存数据结构,它主要是面向内存的。Stream具有如下特性
    8. * (1).Stream不会存储数据。
    9. * (2).Stream不会改变源对象,相反,他们会返回一个持有结果的新Stream
    10. * (3).Stream的操作是延迟执行的。这意味着他们会等到需要结果的时候才执行。
    11. * (4).Stream一旦被关闭就无法再使用。Stream还有一个中间状态,例如用于对源数据的处理,例如分组、过滤等等操作
    12. */
    13. public class Test01 {
    14. static List<Emp> empList=new ArrayList<>();
    15. static Random random=new SecureRandom();
    16. static {
    17. empList.add(new Emp(1001,"刘强东",230,7000.0));
    18. empList.add(new Emp(1002,"马云",20,3000.0));
    19. empList.add(new Emp(1003,"马化腾",50,4500.0));
    20. empList.add(new Emp(1004,"马超",10,10000.0));
    21. empList.add(new Emp(1005,"张一鸣",30,12000.0));
    22. empList.add(new Emp(1005,"张一鸣",30,12000.0));
    23. empList.add(new Emp(1006,"张三鸣",90,12000.0));
    24. empList.add(new Emp(1007,"司马大圣",111,100000.0));
    25. empList.add(new Emp(1008,"欧阳神奇",880,20000.0));
    26. }
    27. public static void main(String[] args) {
    28. method01();
    29. method02();
    30. }
    31. /**
    32. * 创建Stream
    33. */
    34. public static void method01(){
    35. /**
    36. * 方式1:通过集合创建Stream,列举了List、Set、Map数据结构创建Stream
    37. */
    38. //获取一个Stream顺序流,在读取数据时会顺序读取
    39. Stream<String> stream01 = new ArrayList<String>().stream();
    40. //获取一个Stream并行流,在读取数据时会像多线程并行读取,在处理大量数据时能提供处理效率
    41. Stream<String> stream02 = new ArrayList<String>().parallelStream();
    42. Stream<String> stream03=new HashSet<String>().stream();
    43. Stream<Map.Entry<String, String>> stream04=new HashMap<String,String>().entrySet().stream();
    44. /**
    45. * 方式2:通过数组创建Stream,本质上通过Arrays类进行转换
    46. */
    47. Stream<String> stream05=Arrays.stream(new String[]{"1","2"});
    48. /**
    49. * 方式3:通过Stream的静态方法创建Stream
    50. * of(T t):of方法可以将参数转为Stream,本质上还是Arrays.stream(values)。
    51. * empty():创建一个空的Stream。
    52. * generate(Supplier<T> s):生成流数据。
    53. * iterate(final T seed, final UnaryOperator<T> f):通过迭代生出流数据。
    54. * concat(Stream<? extends T> a, Stream<? extends T> b):连接2个Stream
    55. */
    56. Stream<String> stream06=Stream.of();
    57. Stream<String> stream07=Stream.empty();
    58. Stream<Integer> stream08 = Stream.generate(new SecureRandom()::nextInt);
    59. Stream<Integer> stream09=Stream.iterate(0,t->t+2);
    60. Stream<Integer> stream10=Stream.concat(Stream.empty(),Stream.empty());
    61. }
    62. /**
    63. * Stream Api
    64. * filter(Predicate<? super T> predicate):根据布尔值表达式过滤数据。
    65. * forEach(Consumer<? super T> action):遍历Stream处理的数据。
    66. * limit(long maxSize):limit用于截断数据,maxSize为截断的最大长度,limit(3)表示截断Stream中前三个元素。
    67. * skip(long n):跳过元素,此方法会返回n条之后的数据,不包含第n条。
    68. * distinct():排除Stream中重复的数据。
    69. * map(Function<? super T, ? extends R> mapper):遍历数据,并根据表达式返回给Stream。
    70. * count():获取Stream中剩余数据的长度。
    71. * sorted(Comparator<? super T> comparator):根据comparator表达式进行排序。
    72. * max(Comparator<? super T> comparator):根据表达式获取Stream值最大的元素,返回一个Optional对象。
    73. * min(Comparator<? super T> comparator):根据表达式获取Stream值最小的元素,返回一个Optional对象。
    74. * findFirst():返回Stream第一个数据。
    75. * findAny():返回Stream任意一个数据。
    76. * allMatch(Predicate<? super T> predicate):根据表达式判断Stream中所有的元素是否匹配,全部匹配返回true,否则返回false。
    77. * anyMatch(Predicate<? super T> predicate):根据表达式判断Stream中匹配元素,只要有一个元素匹配成功就返回true,否则返回false。
    78. * noneMatch(Predicate<? super T> predicate):根据表达式判断Stream中所有的元素是否都不匹配,全部都不匹配返回true,否则返回false。
    79. * reduce(T identity, BinaryOperator<T> accumulator):可以将流中的元素反复结合起来,得到一个值并返回元素累加之后的值。
    80. * flatMap:将多维数据拍平
    81. * collect:collect允许将流转换为其他形式。
    82. */
    83. public static void method02(){
    84. System.out.println("--------------filter------------------------");
    85. //过滤工资大于7000的员工
    86. empList.stream().filter(emp->emp.getSalary() > 7000)
    87. .forEach(System.out::println);
    88. System.out.println("--------------forEach------------------------");
    89. empList.stream().forEach(emp->{
    90. System.out.println("id:"+emp.getId()+",name:"+emp.getName());
    91. });
    92. System.out.println("--------------limit------------------------");
    93. //截取Stream中前三个元素
    94. empList.stream().limit(3).forEach(System.out::println);
    95. System.out.println("--------------skip------------------------");
    96. //跳过前三条元素,返回第三条之后所有的数据,不含第三条
    97. empList.stream().skip(3).forEach(System.out::println);
    98. System.out.println("--------------distinct------------------------");
    99. empList.stream().distinct().forEach(System.out::println);
    100. System.out.println("--------------map------------------------");
    101. //遍历Stream根据数据项的名称,返回一个新的Stream,然后过滤map返回的Stream中名字长度大于3的员工
    102. empList.stream().map(emp->emp.getName()).
    103. filter(s->s.length()>3).
    104. forEach(System.out::println);
    105. System.out.println("--------------count()------------------------");
    106. long count=empList.stream().filter(emp->emp.getSalary()>7000).count();
    107. System.out.println("Stream的长度:"+count);
    108. System.out.println("--------------sorted()------------------------");
    109. //根据员工的工资进行降序
    110. empList.stream().sorted((emp1,emp2)->Double.compare(emp2.getSalary(),emp1.getSalary()))
    111. .forEach(System.out::println);
    112. System.out.println("--------------max()------------------------");
    113. //查找员工集合中工资最高的
    114. Optional<Emp> max = empList.stream().max(Comparator.comparingDouble(Emp::getSalary));
    115. System.out.println(max);
    116. System.out.println("--------------min()------------------------");
    117. //查找员工集合中工资最低的
    118. Optional<Emp> min = empList.stream().min(Comparator.comparingDouble(Emp::getSalary));
    119. System.out.println(min);
    120. System.out.println("--------------findFirst()------------------------");
    121. Optional<Emp> first = empList.stream().findFirst();
    122. System.out.println(first);
    123. System.out.println("--------------findAny()------------------------");
    124. Optional<Emp> findAny = empList.stream().findAny();
    125. System.out.println(findAny);
    126. System.out.println("--------------allMatch()------------------------");
    127. //判断员工集合中所有人的工资是否都大于7000
    128. boolean bool1 = empList.stream().allMatch(emp -> emp.getSalary() > 7000);
    129. System.out.println(bool1);
    130. System.out.println("--------------anyMatch()------------------------");
    131. //判断员工集合中任意一个人的工资是否大于7000
    132. boolean bool2 = empList.stream().anyMatch(emp -> emp.getSalary() > 7000);
    133. System.out.println(bool2);//true
    134. System.out.println("--------------noneMatch()------------------------");
    135. //判断员工集合中所有人的工资是否都小于7000000,与allMatch相反。
    136. boolean bool3 = empList.stream().noneMatch(emp -> emp.getSalary() > 7000000);
    137. System.out.println(bool3);//false
    138. System.out.println("--------------reduce()------------------------");
    139. //计算员工工资之和,0.0为遍历项的初识值
    140. Double salarySum01 = empList.stream().map(Emp::getSalary).reduce(0.0, (emp1, emp2) -> emp1 + emp2);
    141. System.out.println(salarySum01);
    142. //计算员工工资之和简写
    143. Double salarySum02 = empList.stream().map(Emp::getSalary).reduce(0.0, Double::sum);
    144. System.out.println(salarySum02);
    145. System.out.println("--------------flatMap()------------------------");
    146. List<String> fun1 = Arrays.asList("one", "two", "three");
    147. List<String> fun2 = Arrays.asList("four", "five", "six");
    148. List<List<String>> nestedList = Arrays.asList(fun1, fun2);
    149. nestedList.stream().flatMap(x -> x.stream()).map(x->x.toUpperCase()).forEach(System.out::println);
    150. System.out.println("--------------collect()------------------------");
    151. //Stream转List
    152. List<Emp> collectList = empList.stream().collect(Collectors.toList());
    153. //Stream转Set
    154. Set<Emp> collectSet = empList.stream().collect(Collectors.toSet());
    155. //Stream转Map,如果有相同的id就会转换失败,这里加了个随机数
    156. Map<Integer, String> collectMap = empList.stream().collect(Collectors.
    157. toMap(e->e.getId()+random.nextInt(), Emp::getName));
    158. System.out.println(collectList);
    159. System.out.println(collectSet);
    160. System.out.println(collectMap);
    161. }
    162. }
    1. package com.fly.stream;
    2. import java.util.Objects;
    3. public class Emp {
    4. private Integer id;
    5. private String name;
    6. private Integer age;
    7. private Double salary;
    8. public Emp(Integer id, String name, Integer age, Double salary) {
    9. this.id = id;
    10. this.name = name;
    11. this.age = age;
    12. this.salary = salary;
    13. }
    14. @Override
    15. public String toString() {
    16. return "Emp{" +
    17. "id=" + id +
    18. ", name='" + name + '\'' +
    19. ", age=" + age +
    20. ", salary=" + salary +
    21. '}';
    22. }
    23. public Integer getId() {
    24. return id;
    25. }
    26. public void setId(Integer id) {
    27. this.id = id;
    28. }
    29. public String getName() {
    30. return name;
    31. }
    32. public void setName(String name) {
    33. this.name = name;
    34. }
    35. public Integer getAge() {
    36. return age;
    37. }
    38. public void setAge(Integer age) {
    39. this.age = age;
    40. }
    41. public Double getSalary() {
    42. return salary;
    43. }
    44. public void setSalary(Double salary) {
    45. this.salary = salary;
    46. }
    47. @Override
    48. public boolean equals(Object o) {
    49. if (this == o) {
    50. return true;
    51. }
    52. if (o == null || getClass() != o.getClass()) {
    53. return false;
    54. }
    55. Emp emp = (Emp) o;
    56. return id.equals(emp.id) &&
    57. name.equals(emp.name) &&
    58. age.equals(emp.age) &&
    59. salary.equals(emp.salary);
    60. }
    61. @Override
    62. public int hashCode() {
    63. return Objects.hash(id, name, age, salary);
    64. }
    65. }

    执行结果:

    1. --------------filter------------------------
    2. Emp{id=1004, name='马超', age=10, salary=10000.0}
    3. Emp{id=1005, name='张一鸣', age=30, salary=12000.0}
    4. Emp{id=1005, name='张一鸣', age=30, salary=12000.0}
    5. Emp{id=1006, name='张三鸣', age=90, salary=12000.0}
    6. Emp{id=1007, name='司马大圣', age=111, salary=100000.0}
    7. Emp{id=1008, name='欧阳神奇', age=880, salary=20000.0}
    8. --------------forEach------------------------
    9. id:1001,name:刘强东
    10. id:1002,name:马云
    11. id:1003,name:马化腾
    12. id:1004,name:马超
    13. id:1005,name:张一鸣
    14. id:1005,name:张一鸣
    15. id:1006,name:张三鸣
    16. id:1007,name:司马大圣
    17. id:1008,name:欧阳神奇
    18. --------------limit------------------------
    19. Emp{id=1001, name='刘强东', age=230, salary=7000.0}
    20. Emp{id=1002, name='马云', age=20, salary=3000.0}
    21. Emp{id=1003, name='马化腾', age=50, salary=4500.0}
    22. --------------skip------------------------
    23. Emp{id=1004, name='马超', age=10, salary=10000.0}
    24. Emp{id=1005, name='张一鸣', age=30, salary=12000.0}
    25. Emp{id=1005, name='张一鸣', age=30, salary=12000.0}
    26. Emp{id=1006, name='张三鸣', age=90, salary=12000.0}
    27. Emp{id=1007, name='司马大圣', age=111, salary=100000.0}
    28. Emp{id=1008, name='欧阳神奇', age=880, salary=20000.0}
    29. --------------distinct------------------------
    30. Emp{id=1001, name='刘强东', age=230, salary=7000.0}
    31. Emp{id=1002, name='马云', age=20, salary=3000.0}
    32. Emp{id=1003, name='马化腾', age=50, salary=4500.0}
    33. Emp{id=1004, name='马超', age=10, salary=10000.0}
    34. Emp{id=1005, name='张一鸣', age=30, salary=12000.0}
    35. Emp{id=1006, name='张三鸣', age=90, salary=12000.0}
    36. Emp{id=1007, name='司马大圣', age=111, salary=100000.0}
    37. Emp{id=1008, name='欧阳神奇', age=880, salary=20000.0}
    38. --------------map------------------------
    39. 司马大圣
    40. 欧阳神奇
    41. --------------count()------------------------
    42. Stream的长度:6
    43. --------------sorted()------------------------
    44. Emp{id=1007, name='司马大圣', age=111, salary=100000.0}
    45. Emp{id=1008, name='欧阳神奇', age=880, salary=20000.0}
    46. Emp{id=1005, name='张一鸣', age=30, salary=12000.0}
    47. Emp{id=1005, name='张一鸣', age=30, salary=12000.0}
    48. Emp{id=1006, name='张三鸣', age=90, salary=12000.0}
    49. Emp{id=1004, name='马超', age=10, salary=10000.0}
    50. Emp{id=1001, name='刘强东', age=230, salary=7000.0}
    51. Emp{id=1003, name='马化腾', age=50, salary=4500.0}
    52. Emp{id=1002, name='马云', age=20, salary=3000.0}
    53. --------------max()------------------------
    54. Optional[Emp{id=1007, name='司马大圣', age=111, salary=100000.0}]
    55. --------------min()------------------------
    56. Optional[Emp{id=1002, name='马云', age=20, salary=3000.0}]
    57. --------------findFirst()------------------------
    58. Optional[Emp{id=1001, name='刘强东', age=230, salary=7000.0}]
    59. --------------findAny()------------------------
    60. Optional[Emp{id=1001, name='刘强东', age=230, salary=7000.0}]
    61. --------------allMatch()------------------------
    62. false
    63. --------------anyMatch()------------------------
    64. true
    65. --------------noneMatch()------------------------
    66. true
    67. --------------reduce()------------------------
    68. 180500.0
    69. 180500.0
    70. --------------flatMap()------------------------
    71. ONE
    72. TWO
    73. THREE
    74. FOUR
    75. FIVE
    76. SIX
    77. --------------collect()------------------------
    78. [Emp{id=1001, name='刘强东', age=230, salary=7000.0}, Emp{id=1002, name='马云', age=20, salary=3000.0}, Emp{id=1003, name='马化腾', age=50, salary=4500.0}, Emp{id=1004, name='马超', age=10, salary=10000.0}, Emp{id=1005, name='张一鸣', age=30, salary=12000.0}, Emp{id=1005, name='张一鸣', age=30, salary=12000.0}, Emp{id=1006, name='张三鸣', age=90, salary=12000.0}, Emp{id=1007, name='司马大圣', age=111, salary=100000.0}, Emp{id=1008, name='欧阳神奇', age=880, salary=20000.0}]
    79. [Emp{id=1003, name='马化腾', age=50, salary=4500.0}, Emp{id=1007, name='司马大圣', age=111, salary=100000.0}, Emp{id=1001, name='刘强东', age=230, salary=7000.0}, Emp{id=1008, name='欧阳神奇', age=880, salary=20000.0}, Emp{id=1006, name='张三鸣', age=90, salary=12000.0}, Emp{id=1005, name='张一鸣', age=30, salary=12000.0}, Emp{id=1004, name='马超', age=10, salary=10000.0}, Emp{id=1002, name='马云', age=20, salary=3000.0}]
    80. {961248248=张一鸣, 572791696=司马大圣, 1924575248=欧阳神奇, 1467755674=张一鸣, 1536218504=马云, 422561622=马化腾, 1763656883=张三鸣, -1076432150=刘强东, -1822377697=马超}