我有两个列表:
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 ),但具有两个属性?
有些服务器只存在于其中一个列表中。 最终列表应包含所有服务器。
<code><code> 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);
</code></code>
应该得到的结果是:
[服务器 [名称=MyServer,属性1=Attribute1,属性2=Attribute2],
服务器 [名称=MyServer2,属性1=Attribute1.2,属性2=]]
服务器 [名称=MyServer3,属性1=,属性2=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
的映射表,然后通过名称在地图中查找服务器,将缺失的attribute2
填充为来自servers2
的值。尝试自己编写一些代码。请见以下示例代码: - lexicore