【发布时间】:2018-01-19 22:39:45
【问题描述】:
我正在了解CompletableFutures。
我不是在问the difference between thenApply() and thenCompose()。相反,我想问一个感觉不正确的代码“气味”,以及什么实际上可以证明它的合理性。
从我目前看到的CompletableFutures 的用法看来,你似乎永远不会有这个:
CompletableFuture<String> foo = getSomething().thenApply((result) -> { ... });
也不是这样:
String foo = getSomething().thenCompose((result) -> { ... });
要返回未来,您必须使用thenCompose(),否则使用thenApply()。
不过,从经验来看,语言并没有设计出一种方法来消除每次都做出这种明确的选择,这似乎很奇怪。例如,难道不能有一个方法thenDo() 的返回类型是从lambda 中的return 推断出来的(在编译时)?然后它也可以在编译时被赋予thenApply 或thenCompose 类似的属性。
但我确信有一个很好的理由使用单独的方法,所以我想知道为什么。
是因为在 Java 中从 lambda 推断返回类型很危险还是不可能? (我也是 Java 新手。)
是不是因为有一种情况,单一的方法确实是模棱两可的,唯一的解决办法就是有不同的方法? (我在想可能是嵌套的
CompletableFutures 或复杂的接口和泛型。)如果是这样,有人可以提供一个明确的例子吗?是出于其他原因还是记录在案的建议?
【问题讨论】:
-
thenDo()如何替换这些方法,当它们不同时?在您的命名中,它们将是thenDoNow()与thenDoInBackground()。它们不一样。 -
"是因为在 Java 中从 lambdas 推断返回类型很危险还是不可能?" - 我不会说这是区分这两种方法的原因,但是是的,这是一个真实的陈述。 lambda 的类型(包括类型参数)是从其上下文中推断出来的,而不是相反。
-
@Andreas - 我想编译器应该已经知道基于 lambda 中返回的内容是
thenDoNow()还是thenDoBackground()... -
@AndrewCheong 关于返回的内容是什么?你不是说传入的是什么吗?你是那个告诉方法你想要它做什么的人。
-
@Andreas - 看来我完全误解了这些方法。谢谢。回到我的基础......投票自我关闭。
标签: java lambda language-design completable-future