将List的字段映射到另一个List

时间:2018-02-13 03:27:08

标签: java collections java-8

我是Java 8新手,我有2 List个聊天,如果他们的ID匹配,我希望在List A List B设置一些字段

聊天:

public class Chat {

    private String id;

    private Status status;

    private Rating rating;

    //Setters and getters
}

我可以通过使用嵌套循环来完成它,但不知道如何在java 8中执行它:

List<Chat> listA = getDataForA();
List<Chat> listB = getDataForB();

listA .forEach(a -> {
   listB.forEach(b-> {
       if (b.getId().equals(a.getId())) {
            a.setRating(b.getRating());
            a.setStatus(b.getStatus());
       }
  });
});

2 个答案:

答案 0 :(得分:2)

你可以尝试这个流吗,只有当listA和listB id匹配时,我们才会从listA流设置评级和状态

    listA.stream()
            .flatMap(a -> listB.stream().filter(b -> b.getId().equals(a.getId())).map(b -> {
                a.setRating(b.getRating());
                a.setStatus(b.getStatus());
                return a;
            }))
            .collect(Collectors.toList());

答案 1 :(得分:2)

我会给出另一种方法,而不是简单的两个循环:按id给出列表,然后在所有ID上循环一次:

public static void main(String... args) {
    List<Chat> listA = getDataForA();
    List<Chat> listB = getDataForB();

    Map<String, Chat> mapA = groupById(listA);
    Map<String, Chat> mapB = groupById(listB);

    mapA.entrySet().stream()
        .filter(entry -> mapB.containsKey(entry.getKey()))
        .forEach(entry -> {
            Chat a = entry.getValue();
            Chat b = mapB.get(entry.getKey());
            a.setRating(b.getRating());
            a.setStatus(b.getStatus());
        });
}

private static Map<String, Chat> groupById(Collection<Chat> data) {
    return Optional.ofNullable(data).orElse(Collections.emptyList()).stream().collect(Collectors.toMap(Chat::getId, Function.identity()));
}