一、基本知识
**数据流(stream)**是对集合(collection)功能的增强,更专注于对集合对象的各种便利、高效的聚合,大批量数据操作。
数据流的特点:
- 元素序列 - 流提供了一组特定类型的以顺序方式元素。
- 源 - 流使用集合,数组或I/O资源为输入源。
- 聚合操作 - 数据流支持如filter, map, limit, reduced, find, match等聚合操作。
- 管道传输 - 大多数流操作的返回流本身使他们的结果可以被管道传输。
- 自动迭代 - 流操作内部做了反复对比,其中明确迭代需要集合提供源元素。
Collection接口有两个方法来生成流:
- stream() -返回顺序流考虑集合作为其源。
- parallelStream() - 返回并行数据流考虑集合作为其源。
二、使用示例
测试类:
1/** 2 * 数据流测试 3 * 4 * @author Kevin 5 * @date 2017-01-28 6 */ 7public class StreamTest { 8 9 public static void main(String args[]) { 10 List<String> strings = Arrays.asList("Alphabet", "", "Tesla Motors", "SpaceX", "", "Blue origin"); 11 System.out.println("List: " + strings); 12 13 // filter方法用于消除基于标准元素 14 long count = strings.stream().filter(string -> string.isEmpty()).count(); 15 System.out.println("Empty Strings count: " + count); 16 17 count = strings.stream().filter(string -> string.length() == 6).count(); 18 System.out.println("Strings of length 6 count: " + count); 19 20 // 收集器是用来处理组合在一个数据流的元素的结果 21 List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList()); 22 System.out.println("Filtered List: " + filtered); 23 String mergedString = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.joining(", ")); 24 System.out.println("Merged String: " + mergedString); 25 26 List<Integer> numbers = Arrays.asList(4, 4, 2, 8, 8, 5); 27 System.out.println("numbers List: " + numbers); 28 // map方法用于映射每个元素对应的结果 29 List<Integer> squaresList = numbers.stream().map(i -> i * i).distinct().collect(Collectors.toList()); 30 System.out.println("Squares List: " + squaresList); 31 32 // 计算统计数据 33 List<Integer> integers = Arrays.asList(1, 12, 21, 16, 24, 34); 34 System.out.println("List: " + integers); 35 IntSummaryStatistics stats = integers.stream().mapToInt((x) -> x).summaryStatistics(); 36 37 System.out.println("Highest number in List : " + stats.getMax()); 38 System.out.println("Lowest number in List : " + stats.getMin()); 39 System.out.println("Sum of all numbers : " + stats.getSum()); 40 System.out.println("Average of all numbers : " + stats.getAverage()); 41 42 Random random = new Random(); 43 System.out.println("Random Numbers: "); 44 45 // limit 方法用于减少流的大小 46 // sorted方法用于流排序 47 // 数据流提供了新的forEach方法遍历该流中的每个元素 48 random.ints().limit(10).sorted().forEach(System.out::println); 49 50 // parallelStream是流进行并行处理的替代方案 51 count = strings.parallelStream().filter(string -> string.isEmpty()).count(); 52 System.out.println("Empty Strings: " + count); 53 } 54 55}
运行结果:
1List: [Alphabet, , Tesla Motors, SpaceX, , Blue Origin] 2Empty Strings count: 2 3Strings of length 6 count: 1 4Filtered List: [Alphabet, Tesla Motors, SpaceX, Blue Origin] 5Merged String: Alphabet, Tesla Motors, SpaceX, Blue Origin 6numbers List: [4, 4, 2, 8, 8, 5] 7Squares List: [16, 4, 64, 25] 8List: [1, 12, 21, 16, 24, 34] 9Highest number in List : 34 10Lowest number in List : 1 11Sum of all numbers : 108 12Average of all numbers : 18.0 13Random Numbers: 14-2106309174 15-1591609963 16-1105970115 17-455066830 18242292433 19929670242 201008846372 211047231272 221812276130 231941752343 24Empty Strings: 2
####三、参考文章 1.Java8数据流(http://www.yiibai.com/java8/java8_stream.html)