[英]Find (custom) objects in list from another list
我有兩個清單(火車,貨車)。 我只想擁有帶有“貨車”列表中貨車的火車,並將它們存儲在“finalList”中。
List<train> trains;
List<wagon> wagons;
List<train> finalList
火車具有屬性 Id、Color、Wagon。 貨車具有屬性 Id、Seats、Type。 兩個列表都有幾個條目。
List<train> finalList= trains.stream().filter(tr-> tr.getWagons.retainAll(wagons)).collect(Collectors.toList());
我的 finalList 每次都是空的,我不知道為什么。 與 containsAll() 相同。 我也嘗試過類似的事情:
finalList = trains.stream().filter(tr -> wagons.stream().anyMatch(wg -> tr.getWagons().foreach(trWg -> trWg.getId().equals(wg.getId()))))
但是我無法從貨車列表中按貨車過濾火車列表
我不知道你的 POJO 是什么,因為你沒有發布它們,所以我所能做的就是從你發布的屬性列表中假設。 這是一種方法。
我們所做的就是循環遍歷所有火車,並通過 Wagon 對象列表中是否包含與火車上的貨車具有相同 id 的貨車進行過濾。 然后我們收集到一個列表。
List<Train> trains = Arrays.asList(
new Train(1, 0, new Wagon(0, 1, 0)),
new Train(2, 0, new Wagon(1, 1, 0)));
List<Wagon> wagons = Arrays.asList(new Wagon(0, 1, 0));
List<Train> trainsFromWagons = trains.stream().filter(train -> wagons.stream().anyMatch(wagon -> train.wagon.id == wagon.id))
.collect(Collectors.toList());
所以首先在描述中你說
火車具有屬性 Id, Color, Wagon 。
但是,稍后在示例中:
finalList = trains.stream() .filter(tr -> wagons.stream() .anyMatch(wg ->
tr.getWagons().foreach(trWg -> trWg.getId().equals(wg.getId()))));
因此,我假設第一個是正確的,出於某種原因,您的火車現在只能有一輛貨車
這個“問題”有幾種解決方案:
在我看來,第一個也是最干凈的方法:
List<Wagon> wagons = new ArrayList<>();
wagons.add(new Wagon(0L, new ArrayList<>(), "0"));
wagons.add(new Wagon(1L, new ArrayList<>(), "1"));
List<Train> trains = new ArrayList<>();
trains.add(new Train(0L, wagons.get(0), "Yellow"));
trains.add(new Train(1L, wagons.get(1), "Blue"));
trains.add(new Train(2L, new Wagon(12L, new ArrayList<>(), "not in wagon list"), "Blue"));
List<Train> finalList = trains.stream().
filter(train -> wagons.contains(train.getWagon()))
.collect(Collectors.toList());
finalList.forEach(System.out::println);
和 ofc POJO'S
@Getter
@AllArgsConstructor
@ToString
class Train {
private Long id;
private Wagon wagon;
private String color;
}
@Getter
@ToString
@AllArgsConstructor
@EqualsAndHashCode
class Wagon {
private Long id;
private List<String> seats;
private String type;
}
但是你必須記住在這里為Wagon
實現equals()
無需實現equals()
第二種方法是:
List<Train> finalList2 = trains.stream()
.filter(train -> wagons
.stream()
.anyMatch(wagon -> wagon.getId().equals(train.getWagon().getId())))
.collect(Collectors.toList());
現在假設你的火車可以有不止一輛貨車......
@Getter
@AllArgsConstructor
@ToString
class Train {
private Long id;
private List<Wagon> wagons;
private String color;
}
和代碼:
List<Wagon> wagons = new ArrayList<>();
wagons.add(new Wagon(0L, new ArrayList<>(), "0"));
wagons.add(new Wagon(1L, new ArrayList<>(), "1"));
List<Wagon> wagons2 = new ArrayList<>();
wagons2.add(new Wagon(11L, new ArrayList<>(), "11"));
wagons2.add(new Wagon(12L, new ArrayList<>(), "12"));
List<Train> trains = new ArrayList<>();
trains.add(new Train(0L, wagons,"Yellow"));
trains.add(new Train(1L, wagons2, "Blue"));
trains.add(new Train(2L, Arrays.asList(new Wagon(132L, new ArrayList<>(),"not in wagon list")), "Blue"));
List<Train> finalList3 = trains.stream()
.filter(train -> train.getWagons().containsAll(wagons))
.collect(Collectors.toList());
finalList3.forEach(System.out::println);
只要您假設,您只對包含精確貨車集的火車感興趣。 這個方法也需要equals()
!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.