Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从其他列表中查找列表中的(自定义)对象_Java_Arraylist_Filter_Java 8_Java Stream - Fatal编程技术网

Java 从其他列表中查找列表中的(自定义)对象

Java 从其他列表中查找列表中的(自定义)对象,java,arraylist,filter,java-8,java-stream,Java,Arraylist,Filter,Java 8,Java Stream,我有两张单子(火车、货车)。我只想让那些拥有“货车”列表中货车的列车,并将其存储在“finalList”中 但是我无法从货车列表中按货车过滤列车列表,因为您没有发布它们,所以我不知道您的POJO是什么,所以我所能做的就是从您发布的属性列表中假设。这是一种方法 我们所做的只是在所有列车中循环,并根据货车对象列表是否包含与列车中货车id相同的货车进行过滤。然后我们收集一份清单 List trains=Arrays.asList( 新列车(1,0,新货车(0,1,0)), 新列车(2,0,新货车(1,

我有两张单子(火车、货车)。我只想让那些拥有“货车”列表中货车的列车,并将其存储在“finalList”中


但是我无法从货车列表中按货车过滤列车列表,因为您没有发布它们,所以我不知道您的POJO是什么,所以我所能做的就是从您发布的属性列表中假设。这是一种方法

我们所做的只是在所有列车中循环,并根据货车对象列表是否包含与列车中货车id相同的货车进行过滤。然后我们收集一份清单

List trains=Arrays.asList(
新列车(1,0,新货车(0,1,0)),
新列车(2,0,新货车(1,1,0));
列表货车=数组.asList(新货车(0,1,0));
列出trainsFromWagons=trains.stream().filter(train->wagons.stream().anyMatch(wagon->train.wagon.id==wagon.id))
.collect(Collectors.toList());

我不知道你的POJO是什么,因为你没有发布它们,所以我所能做的就是从你发布的属性列表中假设。这是一种方法

我们所做的只是在所有列车中循环,并根据货车对象列表是否包含与列车中货车id相同的货车进行过滤。然后我们收集一份清单

List trains=Arrays.asList(
新列车(1,0,新货车(0,1,0)),
新列车(2,0,新货车(1,1,0));
列表货车=数组.asList(新货车(0,1,0));
列出trainsFromWagons=trains.stream().filter(train->wagons.stream().anyMatch(wagon->train.wagon.id==wagon.id))
.collect(Collectors.toList());

所以首先在描述中,你说

火车具有属性Id、颜色、货车

但是,在本例后面部分:

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);
  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;
}
@Getter
@AllArgsConstructor
@托斯特林
班车{
私人长id;
私家货车;
私有字符串颜色;
}
以及守则:

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);
List wagons=new ArrayList();
货车。添加(新货车(0L,新ArrayList(),“0”);
货车。添加(新货车(1L,新ArrayList(),“1”);
List wagons2=新的ArrayList();
货车2.添加(新货车(11L,新ArrayList(),“11”);
货车2.添加(新货车(12L,新ArrayList(),“12”);
列表列=新的ArrayList();
列车。添加(新列车(0升,货车,“黄色”);
列车。添加(新列车(1L,货车2,“蓝色”);
列车。添加(新列车(2L,阵列。asList)(新货车(132L,新阵列列表(),“不在货车列表中”),“蓝色”);
List finalList3=trains.stream()
.filter(火车->火车.getWagons().containsAll(货车))
.collect(Collectors.toList());
finalist3.forEach(System.out::println);

只要您假设,您只对包含一套确切货车的火车感兴趣。而
equals()
对于这个方法也是必需的

所以首先在描述中你说

火车具有属性Id、颜色、货车

但是,在本例后面部分:

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);
  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;
}
@Getter
@AllArgsConstructor
@托斯特林
班车{
私人长id;
私家货车;
私有字符串颜色;
}
以及守则:

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);
List wagons=new ArrayList();
货车。添加(新货车(0L,新ArrayList(),“0”);
货车。添加(新货车(1L,新ArrayList(),“1”);
List wagons2=新的ArrayList();
货车2.添加(新货车(11L,新ArrayList(),“11”);
货车2.添加(新货车(12L,新ArrayList(),“12”);
列表列=新的ArrayList();
列车。添加(新列车(0升,货车,“黄色”);
列车。添加(新列车(1L,货车2,“蓝色”);
列车。添加(新列车(2L,阵列。asList)(新货车(132L,新阵列列表(),“不在货车列表中”),“蓝色”);
List finalList3=trains.stream()
.filter(火车->火车.getWagons().containsAll(货车))
.collect(Collectors.toList());
finalist3.forEach(System.out::println);

只要您假设,您只对包含一套确切货车的火车感兴趣。而
equals()
对于这个方法也是必需的

您不想要
.isEmpty()
containsAll
意味着列车拥有所有车厢
retainAll
应该可以工作(尽管需要修改!)-是否有一个狡猾的
equals
方法?否,我想过滤火车列表,这样我就可以从货车列表中获得所有有货车的火车。但我看不出有什么相配的。是
.getWagons.
方法(复制
列表的方法)
finalList
为空意味着
retainAll
返回false,即不进行修改。即使是没有货车的火车?否则我会期望一个
equals
方法总是返回
false
。请为每个方法发布POJO。注意