定义

将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。
元素流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果。

生成流

在 Java 8 中, 集合接口有两个方法来生成流:

  • stream() − 为集合创建串行流。
  • parallelStream() − 为集合创建并行流。

函数式编程

与匿名类不同

  1. import java.util.Arrays;
  2. import java.util.IntSummaryStatistics;
  3. import java.util.List;
  4. import java.util.Random;
  5. import java.util.stream.Collectors;
  6. public class StreamTest {
  7. public static void main(String[] args) {
  8. System.out.println("Use Java8:");
  9. List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd", "", "jkl");
  10. System.out.println("List: "+ strings);
  11. long count=strings.stream().filter(string->string.isEmpty()).count();
  12. System.out.println("Count of empty string: " + count);
  13. count = strings.stream().filter(string->string.length()==3).count();
  14. System.out.println("Count of string with length 3: " + count);
  15. List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());
  16. System.out.println("After filter: " + filtered);
  17. String mergedString = strings.stream().filter(string->!string.isEmpty()).collect(Collectors.joining(", "));
  18. System.out.println("After merged: " + mergedString);
  19. List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
  20. List<Integer> squaresList = numbers.stream().map(i ->i*i).distinct().collect(Collectors.toList());
  21. System.out.println("Squares List: "+ squaresList);
  22. List<Integer> integers = Arrays.asList(1,2,13,4,15,6,17,8,19);
  23. System.out.println("List:" + integers);
  24. IntSummaryStatistics stats = integers.stream().mapToInt((x)->x).summaryStatistics();
  25. System.out.println("Max: " + stats.getMax());
  26. System.out.println("Min: " + stats.getMin());
  27. System.out.println("Sum: " + stats.getSum());
  28. System.out.println("Average: " + stats.getAverage());
  29. System.out.println("Random:");
  30. Random random = new Random();
  31. random.ints(0,100).limit(10).sorted().forEach(System.out::println);
  32. count = strings.parallelStream().filter(string->string.isEmpty()).count();
  33. System.out.println("Count of empty string: " + count);
  34. }
  35. }