Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从倍数列表复制所有值<;DTO1>;到单个列表<;DTO2>;_Java_List_Collections_Hashmap_Java Stream - Fatal编程技术网

Java 如何从倍数列表复制所有值<;DTO1>;到单个列表<;DTO2>;

Java 如何从倍数列表复制所有值<;DTO1>;到单个列表<;DTO2>;,java,list,collections,hashmap,java-stream,Java,List,Collections,Hashmap,Java Stream,对不起我的英语 我有三个列表: 我想制作第三个列表,其中包含3个列表的count属性的值。 以下是我想要的: List D: ListD{id=5, userLogin='cdp', countListA=14, countListB=26, countListC=29} ListD{id=11452, userLogin='clelonginge', countListA=7, countListB=14, countListC=45} ListD{id=11451, userLogin='

对不起我的英语

我有三个
列表

我想制作第三个
列表
,其中包含3个列表的count属性的值。 以下是我想要的:

List D:

ListD{id=5, userLogin='cdp', countListA=14, countListB=26, countListC=29}
ListD{id=11452, userLogin='clelonginge', countListA=7, countListB=14, countListC=45}
ListD{id=11451, userLogin='vdupontinge', countListA=16, countListB=6, countListC=75}
所以我尝试了不同的方法,比如:

ListC = ListA.stream().map(DTO1::getId).collect(Collectors.toList());

(it gave me the following error:

    Error:(475, 98) java: incompatible types: inference variable T has incompatible bounds
        equality constraints: org.ocdm.service.dto.DTO2
        lower bounds: java.lang.Long
)
或者使用HashMap,但我没有找到解决方案

编辑:
ListA、ListB和ListC是相同的类型。它们的类型为:
List

但是清单D是不同的。它的类型为:
List.

DTO1有3个属性:id、userLogin和count


DT02有5个属性:id、userLogin、countListA、countListB和countListC。

如果您知道
id
是唯一的(没有两个
id
s具有不同的
userLogin
s),那么将map作为中介可能会有所帮助

首先,您必须从一个列表创建地图。假设它是
listA

Map<Integer, DTO2> map = listA.stream().collect(Collectors.toMap(item->item.getId(),
                item->new DTO2(item.getId(), item.getUserLogin(), item.getCount(), 0,0)));
请注意,
merge()
需要一个函数。如果
item.setCountListB()
不返回任何内容,则需要在第三个参数中显式返回值。或者,您可以将其声明为
DTO2 setCountListB()
——这是不寻常的,但也是可能的

然后合并最后一个列表。注意,我们将count作为构造函数中的第5个参数传递

listC.forEach(itemC -> map.merge(
            itemC.getId(),
            new DTO2(itemC.getId(), itemC.getUserLogin(), 0, 0,itemC.getCount()),
            (existingItem, noMatter) -> {existingItem.setCountListC(itemC.getCount()); return existingItem;}));
最后,返回
List
,而不是
Map

return map.values().stream().collect(Collectors.toList());
注意,代码依赖于构造函数按特定顺序接收
countA
countB
countC
。这可能会让人困惑,可能您想要使用构建器模式,但它超出了范围



从性能的角度来看,代码可能并不完美,但您已经知道了。

ListA、ListB、ListC是不同的Java类型吗?ListA、ListB和ListC是相同的类型。它们的类型为:List。但是清单D是不同的。它的类型为:List。DTO1有3个属性:id、userLogin和count。DT02有5个属性:id、userLogin、countListA、countListB和countListC。我想在这里这样做比使用streams、map和Collector更有意义。你的意思是在所有列表中循环吗?实际上,我简化了我的示例以便您理解它,但是我的表有很多行和更多列。所以我认为这会减慢我的应用程序。你知道流是如何工作的吗
ListC=ListA.stream().map(DTO1::getId).collect(Collectors.toList())告诉我你没有。也许先从那里开始?好的,谢谢你。我要试试你刚才告诉我的!祝你一切顺利@sinaardehali不客气。如果答案解决了你的问题,别忘了接受它
listC.forEach(itemC -> map.merge(
            itemC.getId(),
            new DTO2(itemC.getId(), itemC.getUserLogin(), 0, 0,itemC.getCount()),
            (existingItem, noMatter) -> {existingItem.setCountListC(itemC.getCount()); return existingItem;}));
return map.values().stream().collect(Collectors.toList());