我有ArrayList
个对象中的一个Car
。我正在检查null值和Germany
,并在if
条件内进行操作。
但是我想使用Optional
类来避免检查null。我该怎么用?
这是我的代码:
public class TestOptional {
public static List<Car> getCarList() {
List<Car> carList = new ArrayList<Car>();
carList.add(new Car("Benz", 2016, "Germany"));
carList.add(new Car("Rolls Royce", 2015, "Russia"));
carList.add(new Car("BMW", 2017, null));
carList.add(new Car("Maruti", 2014, ""));
return carList;
}
public static void main(String args[]) {
List<Car> carList1=getCarList();
for(Car c:carList1) {
if(c.getCountry() != null && c.getCountry().equalsIgnoreCase("Germany")) {
System.out.println(c.getCarName()+" car is from Germany");
}
}
Optional<Car> optional = getCarList();
}
}
我收到此错误:
`Type mismatch: cannot convert from List<Car> to Optional<Car>`
我不确定如何在Optional
个对象上使用List
类。
请找到我的汽车代码:
public class Car {
private String carName;
private int year;
private String country;
public Car(String carName, int year, String country) {
this.carName = carName;
this.year = year;
this.country = country;
}
public String getCarName() {
return carName;
}
public int getYear() {
return year;
}
public String getCountry() {
return country;
}
}
**更新1 **
我开始探索一些Java8功能,并发现了Optional
类,我想使用它。我发现了Optional
类的用法。
在Java 8中,java.util包中新引入了Optional类。引入该类是为了避免在代码中不执行空检查的情况下经常遇到的NullPointerException。使用此类,我们可以轻松地检查变量是否具有null值,并且这样做可以避免NullPointerException。
因此,我尝试为ArrayList应用Optional类,并且希望避免对ArrayList中的所有对象进行空检查。
List<Car> carList1=getCarList();
for(Car c:carList1) {
if(c.getCountry() != null && c.getCountry().equalsIgnoreCase("Germany")) {
System.out.println(c.getCarName()+" car is from Germany");
}
}
在上面的代码中,我检查“国家对象”是否为null。所以在这里我要避免写空校验码(使用Optional Class)。
答案 0 :(得分:3)
通常不建议将Optional
与集合一起使用。您不能完美地代表一个空集合的结果。
您真正想要的是更改您的Car
以避免返回null
国家。
因此,在Car
所在的String getCountry()
内部,将其更改为:
Optional<String> getCountry() {
return Optional.ofNullable(country);
}
然后在循环中可以执行以下操作:
c.getCountry()
.filter(country -> country.equalsIgnoreCase("Germany")
.ifPresent(country -> System.out.println(c.getCarName()+" car is from Germany"));
如果愿意,还可以使用Stream
代替for
循环。
getCarList()
.stream()
.filter(this::isGerman)
.forEach(car -> System.out.println(car.getCarName()+" car is from Germany");
函数isGerman()
是这样的:
boolean isGerman(Car car) {
return c.getCountry()
.filter(country -> country.equalsIgnoreCase("Germany")
.isPresent();
}
答案 1 :(得分:0)
您可以使用类似的方法来检查天气,看看您是否有符合您条件的汽车。不确定这是否是您要的。
Optional<Car> carOptional = getCarList()
.stream()
.filter(Objects::nonNull)
.filter(c -> c.getCountry() != null && c.getCountry().equalsIgnoreCase("Germany"))
.findFirst();