如何使用 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;
}
}
}
我需要检查给定 plateNumber
的 car 是否已经存在于 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()
判断对象是否相等。
我必须通过添加对象来创建结果列表。
这是我的代码。
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;
}
}
}
我需要检查给定 plateNumber
的 car 是否已经存在于 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()
判断对象是否相等。