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 又该怎么理解呢?