[英]Chaining stream of CompletableFuture or chaining CompletableFuture?
我没有看到这之间的主要区别:
List<CompletableFuture<Integer>> intFutures = Stream.of(1, 2, 3, 4)
.map(input -> CompletableFuture.supplyAsync(() -> computeSomethingLong(input)))
.map(future -> future.thenApply(input -> input * 2))
.map(future -> future.thenCompose(computed -> CompletableFuture.supplyAsync(() -> computeSomethingLong(computed))))
.collect(toList());
和这个:
List<CompletableFuture<Integer>> intFutures = Stream.of(1, 2, 3, 4)
.map(input -> CompletableFuture.supplyAsync(() -> computeSomethingLong(input))
.thenApply(computed -> computed * 2)
.thenCompose(computed -> CompletableFuture.supplyAsync(() -> computeSomethingLong(computed))))
.collect(toList());
我做了一个测试,结果和执行时间是一样的。 我能看到的唯一区别是第二个提议允许沿链访问input
变量。 因此,如果我稍后在另一项任务中需要它,我可以使用它。
我错了吗? 还有其他区别吗?
你的结论是正确的。 (几乎)没有区别——多次调用map
可能会分配更多的 memory,因为需要创建并返回一个新的 stream 实例。 从语义上讲,forms 是等价的并且产生相同的结果。
如果您需要访问输入的初始值,那么您需要将这些操作组合成一个操作; 否则该变量在操作(即 lambda)scope 中不可用。
更普遍:
stream
.map(x -> operation1(x))
.map(x -> operation2(x))
.map(x -> operation3(x))
.toList();
// is equivalent to:
stream
.map(x -> operation3(operation2(operation1(x))))
.toList();
或者使用方法调用:
stream
.map(x -> x.method1())
.map(x -> x.method2())
.map(x -> x.method3())
.toList();
// equivalent to:
stream
.map(x -> x.method1().method2().method3())
.toList();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.