我有两个列表(火车、货车)。我只想拥有“wagon”列表中包含货车的火车并将它们存储在“finalList”中。
List<train> trains;
List<wagon> wagons;
List<train> finalList
火车具有 ID、颜色、车厢属性。 货车具有 ID、座位、类型属性。 两个列表都有多个条目。
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()))))
但我无法从货车列表中按货车过滤火车列表
最佳答案
所以首先在描述中你这么说
A train has the attributes 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 的
@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()
对于这个方法也是必要的!
关于java - 从另一个列表中查找列表中的(自定义)对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60479400/