我有以下代码Java的队列评估顺序
myQueue.offer(new myObj(
fcnA,
Collections2.transform(...),
Collections2.transform(...)
))
我的问题是在什么时候被Collections2.transform(...)
评估?
我的猜测是,直到从队列中调用myObj的创建才会发生这种情况。它是否正确?
我有以下代码Java的队列评估顺序
myQueue.offer(new myObj(
fcnA,
Collections2.transform(...),
Collections2.transform(...)
))
我的问题是在什么时候被Collections2.transform(...)
评估?
我的猜测是,直到从队列中调用myObj的创建才会发生这种情况。它是否正确?
总之,是的,它会在构造函数被调用时被评估。
请参阅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 2014-09-29 18:48:42
@maaartinus,你可以自由投票给我,完全回答问题,而不是假设告诉他我认为他需要知道什么。 – Paul 2014-09-29 19:29:49
没有理由downvote。我只想让每个人都看着你的答案,看看还有更多需要考虑的事情。 – maaartinus 2014-09-29 19:40:20
Collections2
看起来像一个番石榴类。如果是这样,那么transform()
会返回一个惰性集合,即实时视图到源集合中。当你通过Collection
接口实际访问colections的元素时(可能是在迭代集合时),将评估所有操作。
如果您需要有一个集合的转换副本,您需要自己复制副本(例如new ArrayList(Collections2.transform(...))
)。
我们没有足够的上下文来说实话 - 除了其他任何东西之外,它取决于你的意思是“什么时候对Collections2.transform(...)进行评估” - 如果你在这个转换中已经有了动作,很可能是执行了'transform',但它会返回一个值,稍后将执行单个动作。 – 2014-09-29 16:09:21