Java 8:按键合并两个包含对象的列表

尼伯(Nibor):

我有两个清单:

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);

应导致:

[服务器[名称= 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; 
            }));
德米特里·戈尔科维茨(Dmitry Gorkovets):

转换每个列表以映射并合并它(我使用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);
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Java 8:合并两个包含ID的对象的列表

合并Java 8中的两个对象列表

如何使用 Java 8 合并两个不同类型的自定义对象列表

使用Java 8合并具有唯一ID的两个列表中的对象

合并Java中的两个对象列表

Java Stream Api-合并两个对象列表

合并两个列表 (java 7)

合并两个对象数组,Java

合并Java中的两个对象

合并两个对象(java)

合并两个流Java 8

合并两个地图与Java 8

两个 List 与 java 8 合并

在Java中合并两个hashMap对象时如何合并列表

合并Java中的两个对象列表以使用Jackson创建一个Json

在相同类型的java中合并两个对象列表

Java的8两个列表流

如何在Java-8中合并来自同一关系的两个列表

合并两个Long类型的列表,并添加到Java 8中的现有地图

根据条件合并两个列表,然后使用Java 8将结果推送到地图

JAVA 8:如何使用2流合并两个列表

检查两个java列表是否包含相同的对象,与元素的顺序和数量无关

如何筛选使用Java 8个流两个列表对象?

如何在Java8流中将两个String列表合并为一个列表而不重复

比较两个对象列表并通过比较java 8中两个列表的一个属性形成一个新列表

使用Java流将两个大小相同(类型不同)的列表合并到域对象列表中

如何通过比较Java中给定对象中的字段值来合并两个对象列表

在Java中以恒定时间合并两个列表

Java:将两个json对象与主键合并