【问题标题】:What does it mean? Java [closed]这是什么意思? Java [关闭]
【发布时间】:2020-10-13 09:44:43
【问题描述】:
something().orElseGet(() -> (a, b, c) -> {})
                   // ^----this part------^

其中(a, b, c) 是一个带有abc 参数的方法。例如:Method(a, b, c) 返回一些东西。

我的问题是在实践中这个功能性接口部分是什么,对我来说这很令人困惑。

【问题讨论】:

  • 看起来像一个函数返回一个函数。
  • 不带参数的函数返回具有三个参数的函数,该函数执行某些操作,但不返回任何内容。
  • 这是一个返回 lambda 的 lambda;你可以用{}return 重写它,以便现在看得更清楚。
  • 我认为您现在不需要了解 .orElseGet(..); 特别返回的内容,因为您对函数式接口、lambda、方法引用等感到困惑。最好先学习这些概念。然后你可以查看 API 文档,看看什么返回什么。

标签: java java-8 functional-interface


【解决方案1】:

它返回一个Supplier,然后提供三参数方法实现(a, b, c) -> {}

通常,Java 中的所有方法参数都会在调用方法后立即进行评估。

这意味着,在orElseGet((a, b, c) -> {}) 的假设情况下,无论是否需要,都会始终创建该方法。但是由于只有在没有其他值存在时才需要它,所以拥有中间供应商意味着该方法仅在实际需要时才创建。

由于在不存在价值的情况下使用的价值可能会任意创造成本,因此供应商可能会节省大量时间。在您的情况下,差别不大(创建供应商或创建 lambda 在成本方面可能大致相同)。但在其他情况下,获取值可能涉及数据库查找、字符串连接等,仅在实际需要时执行这些操作可能会带来巨大的好处。

【讨论】:

  • 在 lambda 表达式的情况下,我们可以肯定地说,实例化的成本并不高。对于像(a, b, c) -> {} 这样的非捕获 lambda 表达式,它几乎为零。并且无论实例化的成本有多大,Supplier 的实例化具有相同的成本,因此使用 orElseGet(() -> (a, b, c) -> {}) 而不是 orElse((a, b, c) -> {}) 不会节省任何费用。
  • 在这种情况下是的。答案的那一部分是更笼统的意思,但我会澄清一下。
  • 谢谢两位的回答!!
猜你喜欢
  • 1970-01-01
  • 2017-07-24
  • 1970-01-01
  • 1970-01-01
  • 2019-09-29
  • 1970-01-01
  • 2021-12-29
  • 2010-11-10
  • 2021-12-30
相关资源
最近更新 更多