String collect1 = Stream.of("a", "g", "v", "b", "c", "d", "e").sorted(String::compareTo).limit(4).collect(Collectors.joining(","));
String collect2 = Stream.of("a", "g", "v", "b", "c", "d", "e").limit(4).sorted(String::compareTo).collect(Collectors.joining(","));
log.info("limit返回排序后数据1: {}", collect1);
log.info("limit返回排序后数据2: {}", collect2);
控制台输出:
09:35:04.836 [main] INFO com.huntkey.rx.sceo.streamapi.StreamApi - limit返回排序后数据1: a,b,c,d
09:35:04.836 [main] INFO com.huntkey.rx.sceo.streamapi.StreamApi - limit返回排序后数据2: a,b,g,v
如果按照我之前的理解把Stream API 当成一个 时间复杂度为 n(执行n次遍历) 来看的话, 即先所有排序完成后, 再对结果进行limit ; 这样理解结果符合预期, 但是从学习来看 应该是只执行了一次遍历, 参考下面代码:
Stream.of("one", "two", "three", "four", "five").filter(x -> x.length() > 3).
peek(x -> System.out.println("Filtered value:" + x)).map(String::toUpperCase)
.peek(x -> System.out.println("Mapped value: " + x)).collect(Collectors.toList());
控制台输出:
Filtered value:three
Mapped value: THREE
Filtered value:four
Mapped value: FOUR
Filtered value:five
Mapped value: FIVE
因此stream的执过程相当于 对流数据中的元素分别调用 filter, peek, map, peek
那sorted 和 limit 又该怎么理解呢?
sorted()方法就是对集合进行排序。
limit()函数就是取集合中的前n项。
调用顺序不一样,得到的结果肯定就不一样了。
这两个方法都直接操作集合,用jdk1.8之前的写法来理解的话,和集合同级别。
filter, peek这些方法,属于集合操作内的,遍历集合,在集合内调用这些方法。