Java 8-对象列表上的可选类

时间:2018-10-31 14:30:15

标签: java java-8

我有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)。

2 个答案:

答案 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();