【发布时间】:2016-11-03 14:07:10
【问题描述】:
我完全理解这个表格:
Set<T> set = new HashSet<>();
list.stream().allMatch(t -> set.add(t));
// And that
list.stream().allMatch(set::add);
但是这个临时实例真的让我很困惑:
list.stream().allMatch(new HashSet<>()::add);
最有趣的是hashset只实例化了一次。
创立于this topic
【问题讨论】:
-
这个顺便提一下,和问题类似,执行
for(int i: new int[] { 1, 2, 4, 6, 9, 42 }) …语句时会创建多少个数组 -
谢谢,这正是我想要的。但这在规范中还是只是当前的实现细节?
-
在JLS§15.13.3. Run-Time Evaluation of Method References中指定。最后,有一个清晰的摘要:“当方法引用表达式在 :: 分隔符之前有一个表达式(而不是类型)时,会立即计算该子表达式。 [...] 这意味着 :: 分隔符之前的表达式仅在程序遇到方法引用表达式时才被评估,并且不会在功能接口类型的后续调用中重新评估。”
标签: lambda java-8 method-reference