Java 为什么新ArrayList<&燃气轮机;()在lambda中添加(someObject)工作?

Java 为什么新ArrayList<&燃气轮机;()在lambda中添加(someObject)工作?,java,arraylist,lambda,Java,Arraylist,Lambda,以下代码行(使用ArrayList.forEach)编译并运行 请注意新的ArrayList())。添加…,这正是我感兴趣的 c.getMembers().forEach(m -> retVal.computeIfAbsent(m.getMemberGid(), v -> new ArrayList<>()).add(c.getClusterGid())); c.getMembers().forEach(m->retVal.computeifassent(m.getMe

以下代码行(使用ArrayList.forEach)编译并运行

请注意新的ArrayList())。添加…,这正是我感兴趣的

c.getMembers().forEach(m -> retVal.computeIfAbsent(m.getMemberGid(), v -> new ArrayList<>()).add(c.getClusterGid()));
c.getMembers().forEach(m->retVal.computeifassent(m.getMemberGid(),v->newarraylist()).add(c.getClusterGid());
为了避免混淆,retVal被定义为前一行的HashMap,因此“computeFabSent”

但是,下一行代码不起作用,并且给出了一个关于返回类型不匹配的错误(不足为奇)

List<Gid> list = new ArrayList<>().add(new Gid());
List List=new ArrayList().add(new Gid());
对象类型(Gid等)并不重要——我只是想知道为什么它在第一行forEach/lambda中工作

lambda代码是否在封面下显示Arrays.asList或类似内容?这里我不明白什么…?

方法List::add()不会返回List本身。它返回的布尔值无法转换为列表

ComputeFabSent为什么工作? 调用时,传递以下参数:

V computeIfAbsent(K key, Function<? super K,? extends V> mappingFunction)
它返回布尔值,而不是列表

如果您有兴趣在现场创建新的元素列表,可以使用:

List List=Arrays.asList(new Gid(),new Gid());
请注意,这将创建一个固定大小的ArrayList(不能将元素添加到此列表)。要解决此问题,请使用:

List<Gid> list = new ArrayList<>(Arrays.asList(new Gid(), new Gid()));
List List=newarraylist(Arrays.asList(new Gid(),new Gid());

它将固定大小的列表复制到新的ArrayList中。

lambda不是区别。您可以执行
newarraylist()。添加(new Gid())
所有您喜欢的操作;您无法将结果分配给
列表
变量,因为
添加
不返回列表。您缺少一个关键的
。“我只是想知道为什么它在第一个forEach/lambda行中工作?”但您为什么认为它不应该工作?在第一个示例中,您到底在哪里做这样的事情?请注意,您不是在调用
.computeIfAbsent(…,v->new ArrayList().add(…)
而是在调用
.computeIfAbsent(…,v->new ArrayList()).add(…)
-您是在调用computeIfAbsent的结果时调用
add
,而不是在其内部。@Pshemo--这对我来说是一针见血。第一行代码中的“为什么”解释了它的工作原理。在这一点上,它本质上是myArrayList.add(Gid)。。。已发送计算结果。。。。
List<Gid> list = Arrays.asList(new Gid(), new Gid());
List<Gid> list = new ArrayList<>(Arrays.asList(new Gid(), new Gid()));