繁体   English   中英

为什么 new ArrayList<>().add(someObject) 在 lambda 中工作?

[英]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 有效?

当您调用computeIfAbsent ,您传递以下参数:

V computeIfAbsent(K key, Function<? super K,? extends V> mappingFunction)

此方法返回地图值的类型。 鉴于您的第二个参数v -> new ArrayList<>()您的值类型可能是ArrayListList 因此,如果键存在,则返回相应的列表。 如果键不存在,则返回一个新的 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM