[英]Map fields of a List to another List
我是新來的Java 8,我有2個List
聊天的,我想設置在某些領域List A
從List B
,如果他們的ID是匹配
聊天:
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());
}
});
});
你可以嘗試這個流嗎,只有當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());
我會給出另一種方法,而不是簡單的兩個循環:按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()));
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.