我是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());
}
});
});
答案 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()));
}