Java 8 - необязательный класс в списке объектов - PullRequest
0 голосов
/ 31 октября 2018

У меня есть ArrayList из Car объектов. Я проверяю нулевые значения и Germany и что-то делаю внутри условия if.

Но я хочу использовать Optional класс, чтобы избежать проверки на ноль. Как я могу использовать это?

Вот мой код:

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 у нас есть новый класс Optional в пакете java.util. Этот класс введен, чтобы избежать исключения NullPointerException, с которым мы часто сталкиваемся, если не выполняем нулевые проверки в нашем коде. Используя этот класс, мы можем легко проверить, имеет ли переменная нулевое значение или нет, и, делая это, мы можем избежать исключения NullPointerException.

Итак, я попытался применить необязательный класс для моего ArrayList, и я хочу избежать проверки на нуль всех моих объектов в моем 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");
        }
    }

В приведенном выше коде я проверяю нулевое значение для объекта страны. Поэтому здесь я хочу избежать написания нулевого контрольного кода (с использованием необязательного класса).

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Обычно не рекомендуется использовать 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();
}
0 голосов
/ 31 октября 2018

Вы можете использовать что-то вроде этого, чтобы проверить, соответствует ли ваш автомобиль вашему состоянию. Не уверен, что это то, о чем ты спрашиваешь.

Optional<Car> carOptional = getCarList()
                           .stream()
                           .filter(Objects::nonNull)
                           .filter(c -> c.getCountry() != null && c.getCountry().equalsIgnoreCase("Germany"))
                           .findFirst();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...