【问题标题】:Java Queue evaluation orderJava 队列评估顺序
【发布时间】:2014-09-29 16:07:08
【问题描述】:

我有以下代码

myQueue.offer(new myObj(
    fcnA,
    Collections2.transform(...),
    Collections2.transform(...)
))

我的问题是Collections2.transform(...) 在什么时候评估?

我的猜测是在从队列中调用 myObj 的创建之前不会发生这种情况。这是正确的吗?

【问题讨论】:

  • 说实话,我们并没有足够的上下文来说明 - 除了其他任何事情之外,这取决于您所说的“Collections2.transform(...) 评估的时间点”是什么意思 - 如果您已经在该转换中获得了操作,很可能是 transform 已执行,但它返回一个值,稍后将执行各个操作。

标签: java guava operator-precedence


【解决方案1】:

总之,是的,在构造函数被调用的时候会被求值。

请参阅 Java 语言规范 (JLS),15.12.4.2. Evaluate Arguments,尤其是最后 2 段和Example 15.12.4.1-2. Evaluation Order During Method Invocation

【讨论】:

  • 确实如此,但可能无关紧要,因为Collections2.transform 什么都不做。它只创建一个TransformedCollection,这是lazy。因此,您完美地回答了 OP 的要求,但可能错过了他们需要知道的内容。
  • @maaartinus,你可以随意投反对票,因为我完美地回答了这个问题,而不是假设告诉他我认为他需要知道的事情。
  • 没有理由投反对票。我只是希望每个人都看到你的答案,看看还有更多需要考虑的地方。
【解决方案2】:

Collections2 看起来像 Guava 类。如果是这样,那么transform() 返回一个惰性集合,即源集合的实时视图。当您通过Collection 接口实际访问集合的元素时(可能是在您遍历集合时),所有操作都会被评估。

如果您需要收藏的转换副本,您需要自己制作副本(例如 new ArrayList(Collections2.transform(...)) )。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-13
    相关资源
    最近更新 更多