Java 8:按键合并两个包含对象的列表
2022-09-04 23:11:26
我有两个列表:
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
包含带有 a 和 an(但没有 )的服务器。
包含带有 a 和 an(但没有 )的服务器。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
}
有谁知道如何将这两个列表合并为一个列表,每个列表仅包含一次(by)但同时具有两个属性?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);
应导致:
[服务器 [名称 = MyServer,属性 1 = 属性 1,属性 2 = 属性 2],
服务器 [名称 = MyServer2, 属性 1 = 属性 1.2, 属性 2 = ]]
服务器 [名称 = MyServer3, 属性 1=, 属性 2=属性 2.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;
}));