jdk8出来日子不短了,jdk11都出来了,不过用的最多的不过是1.5罢了。

今年终于鼓起勇气认真对待它,在18年记录下学习stream,画上一个圆。

Java8中有两大最为重要的改变。第一个是Lambda 表达式;另外一个则是Stream API(java.util.stream.*)。

说说stream吧。前提得有lambda的基础。

Stream 是Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。使用Stream API 对集合数据进行操作,就类似于使用SQL 执行的数据库查询。也可以使用Stream API 来并行执行操作。简而言之,Stream API 提供了一种高效且易于使用的处理数据的方式。

对stream的操作分为三类。

  1. 创建stream
  2. 中间操作(intermediate operations)
  3. 结束操作(terminal operations):

流程如下图

创建stream

虽然大部分情况下stream是容器调用Collection.stream()方法得到的,但stream和collections有以下不同:

  • 无存储。stream不是一种数据结构,它只是某种数据源的一个视图,数据源可以是一个数组,Java容器或I/O channel等。
  • 为函数式编程而生。对stream的任何修改都不会修改背后的数据源,比如对stream执行过滤操作并不会删除被过滤的元素,而是会产生一个不包含被过滤元素的新stream。
  • 惰式执行。stream上的操作并不会立即执行,只有等到用户真正需要结果的时候才会执行。
  • 可消费性。stream只能被“消费”一次,一旦遍历过就会失效,就像容器的迭代器那样,想要再次遍历必须重新生成。
Stream API是Java 8中加入的一套新的API,主要用于处理集合操作,不过它的处理方式与传统的方式不同,

称为“数据流处理”。流(Stream)类似于关系数据库的查询操作,是一种声明式操作。比如要从数据库中获取所有id大于1(filter)的用户的名称(map)


并按照用户的score进行排序(sorted),如果在sql中就会很容易完成,但是在java程序中,在jdk8以前可能要使用很多的if条件,但是在jdk8的stream


流中,我们可以这样
  1. @Test
  2. public void test5() {
  3. List<String> collect = list.stream()
  4. .filter(p -> p.getId() > 1)
  5. .sorted(Comparator.comparing(Star::getScore))
  6. .map(Star::getName)
  7. .collect((Collectors.toList()));
  8. System.out.println(collect);
  9. }

 就是这么的容易。

 
 
 
 
jdk双冒号
还是比较绕的,看代码就明白了。详细借鉴
  1. package com.test;
  2. import java.util.Arrays;
  3. import java.util.List;
  4. import java.util.function.Consumer;
  5. import org.junit.Test;
  6. public class DoubleColonTest {
  7. public static void myPrint(String str) {
  8. System.out.println("print value : " + str);
  9. }
  10. /**
  11. * 不使用双冒号
  12. */
  13. @Test
  14. public void test1() {
  15. List<String> list = Arrays.asList("刘德华","黎明","张学友","郭富城");
  16. list.forEach(p -> myPrint(p));
  17. }
  18. /**
  19. * 使用双冒号
  20. */
  21. @Test
  22. public void test2() {
  23. List<String> list = Arrays.asList("刘德华","黎明","张学友","郭富城");
  24. list.forEach(DoubleColonTest::myPrint);
  25. }
  26. /**
  27. * 类似于双冒号
  28. */
  29. @Test
  30. public void test3() {
  31. List<String> list = Arrays.asList("刘德华","黎明","张学友","郭富城");
  32. Consumer<String> methodParam = DoubleColonTest::myPrint;
  33. list.forEach(methodParam);
  34. }
  35. /**
  36. * 类似于双冒号
  37. */
  38. @Test
  39. public void test4() {
  40. List<String> list = Arrays.asList("刘德华","黎明","张学友","郭富城");
  41. Consumer<String> methodParam = DoubleColonTest::myPrint;
  42. list.forEach(p -> methodParam.accept(p));
  43. }
  44. }

 

 

完整代码实例

  1. package com.test;
  2. import java.util.ArrayList;
  3. import java.util.Collections;
  4. import java.util.Comparator;
  5. import java.util.Iterator;
  6. import java.util.List;
  7. import java.util.stream.Collectors;
  8. import java.util.stream.Stream;
  9. import org.junit.Before;
  10. import org.junit.Test;
  11. public class TestStream {
  12. List<Star> list = null;
  13. @Before
  14. public void before() {
  15. list = new ArrayList<Star>() {
  16. {
  17. add(new Star(1, "张学友", 11.3));
  18. add(new Star(3, "刘德华", 4.3));
  19. add(new Star(2, "黎明", 13.3));
  20. add(new Star(5, "郭富城", 22.3));
  21. add(new Star(4, "范冰冰", 2.3));
  22. }
  23. };
  24. }
  25. /**
  26. * 遍历方式
  27. */
  28. @Test
  29. public void test1() {
  30. System.out.println("第一种---------");
  31. for (Star Star : list) {
  32. System.out.println(Star);
  33. }
  34. System.out.println("第二种---------");
  35. list.forEach(p -> System.out.println(p));
  36. System.out.println("第三种---------");
  37. list.forEach(System.out::println);
  38. System.out.println("第四种---------");
  39. Iterator<Star> iterator = list.iterator();
  40. while (iterator.hasNext()) {
  41. System.out.println(iterator.next());
  42. }
  43. System.out.println("第五种---------");
  44. for (int i = 0; i < list.size(); i++) {
  45. System.out.println(list.get(i));
  46. }
  47. System.out.println("第六种---------");
  48. for (Iterator<Star> it = list.iterator(); it.hasNext();) {
  49. System.out.println(it.next());
  50. }
  51. System.out.println("第七种---------");
  52. for (int i = 0; i < list.size();) {
  53. System.out.println(list.get(i));
  54. i++;
  55. }
  56. }
  57. /**
  58. * 普通排序
  59. */
  60. @Test
  61. public void test2() {
  62. Collections.sort(list, new Comparator<Star>() {
  63. @Override
  64. public int compare(Star o1, Star o2) {
  65. return o1.getScore().compareTo(o2.getScore());
  66. }
  67. });
  68. list.forEach(p -> System.out.println(p));
  69. }
  70. /**
  71. * lambda排序
  72. */
  73. @Test
  74. public void test3() {
  75. Collections.sort(list, (p1, p2) -> p1.getScore().compareTo(p2.getScore()));
  76. list.forEach(p -> System.out.println(p));
  77. }
  78. /**
  79. * streame排序
  80. */
  81. @Test
  82. public void test4() {
  83. Stream<Star> stream = list.stream().sorted(Comparator.comparing(Star::getScore));// .forEach(p ->
  84. stream.forEach(p -> System.out.println(p));
  85. // list.forEach(p -> System.out.println(p));
  86. }
  87. /**
  88. * 进行过滤操作
  89. */
  90. @Test
  91. public void test5() {
  92. List<String> collect = list.stream()
  93. .filter(p -> p.getId() > 1)
  94. .sorted(Comparator.comparing(p -> p.getScore()))
  95. // .sorted(Comparator.comparing(Star::getScore))
  96. .map(Star::getName)
  97. .collect((Collectors.toList()));
  98. System.out.println(collect);
  99. }
  100. }
  101. class Star {
  102. private Integer id;
  103. private String name;
  104. private Double score;
  105. public Double getScore() {
  106. return score;
  107. }
  108. public void setScore(Double score) {
  109. this.score = score;
  110. }
  111. public Integer getId() {
  112. return id;
  113. }
  114. public void setId(Integer id) {
  115. this.id = id;
  116. }
  117. public String getName() {
  118. return name;
  119. }
  120. public void setName(String name) {
  121. this.name = name;
  122. }
  123. public Star() {
  124. super();
  125. }
  126. public Star(Integer id, String name, Double score) {
  127. super();
  128. this.id = id;
  129. this.name = name;
  130. this.score = score;
  131. }
  132. @Override
  133. public String toString() {
  134. return "Star [id=" + id + ", name=" + name + ", score=" + score + "]";
  135. }
  136. }

 

OK,到位,入个门。。。

 
借鉴的地址
http://www.nowcode.cn/index.php/2017/02/27/326/
https://www.jianshu.com/p/ceb7bf515c03
 
 
 
 
 

 

版权声明:本文为c-h-y原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/c-h-y/p/10127884.html