如何使用 Streams 检查对象是否存在列表

How to check whether an object exists a List using Streams

我必须通过添加对象来创建结果列表。

这是我的代码。

private ArrayList<Car> carsInStore ;

public boolean addCarToStore(String type, String model, String color,
                                    int maxSpeed,int year,String plateNumber) {
    for (Car car : carsInStore) {
        if (car.getPlateNumber()==plateNumber) {
            return false;
        }
        else {
            carsInStore.add(new Car(type, model, color, maxSpeed,
                                        year, plateNumber));
            return true;
        }
    }
}

我需要检查给定 plateNumbercar 是否已经存在于 ArrayList 中,如果存在,那么 新车不加

我想通过 Java 流执行检查。

我正在使用 Java 11.

如果您想使用流重写您的方法,如评论中所建议的,您可以使用流检查 List 中是否已存在具有给定车牌号的 Car;如果没有,那么您可以将其添加到 carsInStore.

此外,要检查两个 String 是否相等,您需要使用 equals 方法。 == 运算符检查面对变量的内容,在引用的情况下,它们的内容对应于它们指向的对象的内存地址,而不是它们所代表的实际值。

private ArrayList<Car> carsInStore;

public boolean addCarToStore(String type, String model, String color, int maxSpeed, int year, String plateNumber) {
    if (carsInStore.stream()
        .filter(c -> c.getPlateNumber().equals(plateNumber))
        .findFirst()
        .isEmpty()) {
        return false;
    }

    carsInStore.add(new Car(type, model, color, maxSpeed, year, plateNumber));
    return true;
}

您可以使用 findAny()。参考 here.

Stream findAny() returns an Optional (a container object which may or may not contain a non-null value) describing some element of the stream, or an empty Optional if the stream is empty. The behavior of Stream 'findAny()' operation is explicitly non-deterministic, it is free to select any element in the stream. Multiple invocations on the same source may not return the same result.

使用Optional class检查空指针异常。

Optional<Car> result =  carsInStore.stream().filter(c -> c.getPlateNumber().equals(plateNumber)).findAny();
    if(!result.isPresent()){
      // your logic 
    }

我想我明白你的问题了。您想用流式 API 实现替换 addCarToStore 方法中的 for each 循环:

Optional<Car> existingCar = carsInStore
    .stream()
    .filter(c -> c.getPlateNumber().equals(plateNumber))
    .findAny();

if (existingCar.isEmpty()) {
    carsInStore.add(new Car(type, model, color, maxSpeed, year, plateNumber));
}

如果给定 属性 的汽车已经存在,要生成布尔结果,您需要使用 anyMatch() 操作,它需要一个 predicate -表示布尔条件的函数。

findFirst()findAny()相反,当你需要获取一个对象作为结果时很有用,anyMatch()它return是boolean的值并且无需解释可选结果。

public boolean addCarToStore(String type, String model, String color,
                             int maxSpeed, int year, String plateNumber) {
    
    boolean alreadyExist = carsInStore.stream()
        .anyMatch(car -> car.getPlateNumber().equals(plateNumber));
    
    if (!alreadyExist) {                
        carsInStore.add(new Car(type, model, color, maxSpeed,
                                year, plateNumber));
    }
    
    return alreadyExist;
}

您提供的方法无法正常工作。循环在迭代的第一步终止而不检查所有元素,即它可能 return 一个不正确的结果,并且您将在列表中重复。

只有在检查两个引用是否指向同一个对象时才使用双等号,否则使用方法equelst()判断对象是否相等。