将Scala Future和Promise转换为Java 8 ComletableFuture

将Scala Future和Promise转换为Java 8 ComletableFuture,scala,java-8,promise,future,completable-future,Scala,Java 8,Promise,Future,Completable Future,我已经读过了,我理解这个概念是 你可以把未来和承诺看作是管道的两个不同方面。在承诺方面,数据被推入,而在未来方面,数据可以被拉出 现在我想知道如何使用Java8的CompletableFuture来做同样的事情 示例代码: Promise<String> promise = new Promise.DefaultPromise<>(); listOfString.stream().forEach(oneString -> { promise.trySucce

我已经读过了,我理解这个概念是

你可以把未来和承诺看作是管道的两个不同方面。在承诺方面,数据被推入,而在未来方面,数据可以被拉出

现在我想知道如何使用Java8的CompletableFuture来做同样的事情

示例代码:

Promise<String> promise = new Promise.DefaultPromise<>();
listOfString.stream().forEach(oneString -> {
    promise.trySuccess(oneString);
});
//..... some other computation here ....
promise.future().map(new Mapfunction{...});
Promise Promise=newpromise.DefaultPromise();
listOfString.stream().forEach(oneString->{
承诺。尝试成功(一串);
});
//..... 这里还有其他一些计算。。。。
promise.future().map(新的映射函数{…});

我想知道如何使用Java 8
CompletableFuture
来实现同样的功能,因为我认为
CompletableFuture
并不像Scala promise那样具有数据推入和数据推出的概念。

在Java 8
CompletableFuture
中是计算的“写入”端,而
CompletionStage
是“读取”端

例如:

CompletableFuture<String> fut = new CompletableFuture<String>();
listOfString.stream().forEach(oneString -> {
  fut.complete(oneString);
});
// do some stuff (possibily asynchronously)
// and then complete the future
fut.thenApply(/* some computation */);
CompletableFuture fut=新的CompletableFuture();
listOfString.stream().forEach(oneString->{
未来完成(一串);
});
//做一些事情(可能是异步的)
//然后完成未来
进一步应用(/*一些计算*/);

现在,由于
CompletableFuture
扩展了
CompletionStage
,您可以将
fut
实例作为
CompletionStage
传递,您的用户将能够在它完成后附加异步操作来执行。

看看这个示例可以简化为
CompletableFuture.completedFuture(“测试可完成的未来”)
…我没有Scala方面的经验。在问题的例子中,在每个人的
中都有
Promise.trySuccess(oneString)
,这让我想知道它是否应该引用
Promise
(小写
p
)以及“在循环中尝试”是什么成语的意思是,语义上。这个尝试怎么会失败?@zt1983811我刚刚读到Scala的承诺,我的怀疑是对的,在循环中调用
trysucces
没有任何意义。此外,你的代码并没有显示你所做的尝试(使用
CompletableFuture
)…@zt1983811:为什么不呢?如果在异步操作中完成了一个
CompletableFuture
,那么您也无法控制完成是否在“之前”
然后应用
或不应用,因为这就是并发的含义。我敢肯定Scala的promise/future功能也以同样的方式支持这一点…@zt1983811:“一旦完成”是什么意思
trySuccess
正在完成它,第一个元素将发生这种情况。因此,对列表中的所有元素重复该操作没有任何意义,因为除了第一次尝试之外,其他所有操作都将被忽略。