[英]Why does new ArrayList<>().add(someObject) work in a lambda?
以下代码行(使用 ArrayList.forEach)编译并运行...
请注意新的 ArrayList<>()).add...这是我感兴趣的。
c.getMembers().forEach(m -> retVal.computeIfAbsent(m.getMemberGid(), v -> new ArrayList<>()).add(c.getClusterGid()));
为避免混淆,retVal 被定义为前一行的 HashMap,因此“computeIfAbsent”
但是,下一行代码不起作用,并给出了关于返回类型不匹配的(并不奇怪)错误......
List<Gid> list = new ArrayList<>().add(new Gid());
对象类型(Gid 等)并不重要 - 我只是想知道为什么它在第一行 forEach / lambda 中起作用?
lambda 代码是否在幕后执行 Arrays.asList 或类似的操作? 我在这里不明白什么......?
方法List::add()不返回列表本身。 它返回无法转换为 List 的布尔值
当您调用computeIfAbsent
,您传递以下参数:
V computeIfAbsent(K key, Function<? super K,? extends V> mappingFunction)
此方法返回地图值的类型。 鉴于您的第二个参数v -> new ArrayList<>()
您的值类型可能是ArrayList或List 。 因此,如果键存在,则返回相应的列表。 如果键不存在,则返回一个新的 ArrayList。
您创建一个新的 ArrayList 并立即调用add
。 从方法定义中可以看出:
boolean add(E e)
它返回一个布尔值,而不是一个列表。
如果你有兴趣当场创建一个新的元素列表,你可以使用Arrays.asList
:
List<Gid> list = Arrays.asList(new Gid(), new Gid());
请注意,这会创建一个固定大小的 ArrayList(您不能向该列表添加元素)。 要解决此问题,请使用:
List<Gid> list = new ArrayList<>(Arrays.asList(new Gid(), new Gid()));
它将固定大小的列表复制到新的 ArrayList 中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.