【发布时间】:2017-01-12 12:02:19
【问题描述】:
我有两个列表:
List<Server> servers1 = new ArrayList<>();
Server s1 = new Server("MyServer");
s1.setAttribute1("Attribute1");
servers1.add(s1);
List<Server> servers2 = new ArrayList<>();
Server s2 = new Server("MyServer");
s2.setAttribute2("Attribute2");
servers2.add(s2);
servers1 包含具有name 和attribute1 的服务器(但没有attribute2)。servers2 包含具有name 和attribute2 的服务器(但没有attribute1 )。
public class Server {
private String name;
private String attribute1;
private String attribute2;
public Server(String name) {
this.name = name;
this.attribute1 = "";
this.attribute2 = "";
}
//Getters & Setters
}
有谁知道如何将这两个列表合并为一个包含
每个Server 仅一次(name)但同时具有两个属性?
有些服务器只存在于一个或另一个列表中。 最终列表应包含所有服务器。
List<Server> servers1 = new ArrayList<>();
Server s1 = new Server("MyServer");
s1.setAttribute1("Attribute1");
Server s2 = new Server("MyServer2");
s2.setAttribute1("Attribute1.2");
servers1.add(s1);
servers1.add(s2);
List<Server> servers2 = new ArrayList<>();
Server s3 = new Server("MyServer");
s3.setAttribute2("Attribute2");
Server s4 = new Server("MyServer3");
s4.setAttribute2("Attribute2.2");
servers2.add(s3);
servers2.add(s4);
应该导致:
[服务器[name=MyServer,attribute1=Attribute1,attribute2=Attribute2],
服务器 [name=MyServer2,attribute1=Attribute1.2,attribute2=]]
服务器 [name=MyServer3, attribute1=, attribute2=Attribute2.2]]
//解决方案(感谢大家的帮助!)
Map<String, Server> serverMap1 = Stream.concat(servers1.stream(), servers2.stream())
.collect(Collectors.toMap(Server::getName, Function.identity(),
(server1, server2) -> {
server1.setAttribute2(server2.getAttribute2());
return server1;
}));
【问题讨论】:
-
从
servers1创建一个name到Server的映射,然后从servers2填充缺少的attribute2,按名称在映射中查找服务器。尝试自己编写一些代码。 -
如果这是您的
Server类的全部内容,那么List中的实体如何具有name、attribute1或attribute2的任何值。如果这不是整个类,请包括构造函数 -
这两个列表是否始终包含相同的服务器或存在不会合并的服务器?
-
好问题。有些服务器不会被合并。最后我需要所有服务器,如果它们可以合并,应该。
-
我尝试了同样的事情。我没有获取第一个列表中不存在的第二个列表对象的数据。在这种情况下,对于 server3
标签: java list java-8 java-stream