【发布时间】:2015-05-16 03:27:40
【问题描述】:
给定以下代码:
List<String> list = Arrays.asList("a", "b", "c");
list.stream()
.map(s -> s + "-" + s) //"a-a", "b-b", "c-c"
.filter(s -> !s.equals("b-b")) //"a-a", "c-c"
.forEach(s -> System.out.println(s));
map 和 filter 是中间操作,forEach 是终端操作。只有在终端操作执行后,我们才能得到数据转换的结果。
有没有办法强制评估更加急切并获得某种中间结果 - 而不会破坏流操作链?例如,我想要“a-a”、“b-b”、“c-c”的列表(这将是第一个中间操作的结果)。
【问题讨论】:
-
你不能
peekmap和filter之间的流吗?map(...).peek(targetList::add).filter(...)。当然,如果流是并行的,你需要使用线程安全列表。 -
您可以将它们收集()到一个列表或将它们排列到一个数组中,然后启动一个新的管道。从功能上讲,这正是您想要的。它不是 same 流管道,但这完全是一种审美上的反对。
标签: java java-8 java-stream