Nib*_*bor 7 java list java-8 java-stream
我有两个清单:
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);
Run Code Online (Sandbox Code Playgroud)
servers1包含带a name和a attribute1(但不是attribute2)的服务器.
servers2包含带a name和a 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
}
Run Code Online (Sandbox Code Playgroud)
有谁知道我如何将这两个列表合并到一个列表中,每个列表Server只包含一次(by 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);
Run Code Online (Sandbox Code Playgroud)
应该导致:
[Server [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;
}));
Run Code Online (Sandbox Code Playgroud)
将每个列表转换为映射并合并它(我使用 Lombok 不编写样板代码):
@Data
@NoArgsConstructor
@AllArgsConstructor
class Server {
private String name;
private String attribute1;
private String attribute2;
}
public class ServerMain {
public static void main(String[] args) {
List<Server> servers1 = Arrays.asList(
new Server("name1", "attr1.1", null),
new Server("name2", "attr1.2", null));
List<Server> servers2 = Arrays.asList(
new Server("name1", null, "attr2.1"),
new Server("name2", null, "attr2.2"));
Map<String, Server> serverMap1 = servers1.stream().collect(Collectors.toMap(Server::getName, Function.identity()));
Map<String, Server> serverMap2 = servers2.stream().collect(Collectors.toMap(Server::getName, Function.identity()));
serverMap1.keySet().forEach(key -> serverMap1.merge(key,
serverMap2.get(key),
(server1, server2) -> {
server1.setAttribute2(server2.getAttribute2());
return server1;
}));
System.out.println(serverMap1);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6496 次 |
| 最近记录: |