Ссылка на конструктор в тернарном операторе Java 8 - PullRequest
2 голосов
/ 10 июля 2020

Я хочу заменить функцию if-else однострочным оператором return, и мне было интересно, почему я не могу создать объект через ссылку на конструктор в тернарном операторе?

Что бы я хотел чтобы заменить что-то вроде этого:

public Animal createAnimal(boolean isDangerous) {
        if(isDangerous) {
          Shark shark = new Shark();  // Shark extends Animal
          return shark ;
        }       
        Cat cat = new Cat(); //Cat extends Animal
        return cat;
    }

Это работает нормально:

public Animal createAnimal(boolean isDangerous) {
        Shark shark = new Shark(); // Shark extends Animal
        Cat cat = new Cat(); //Cat extends Animal
        return isDangerous ? shark : cat;
    }

Это также работает с другой частью кода:

Optional<Animal> animalOptional = zoo.getAnimals().stream().findAny(); //getAnimals() is returning a Set<Animal>
animalOptional.orElseGet(isDangerous ? Shark::new : Cat::new); // -> it creates me an Object depending on the boolean

Но если я хочу вернуть туда объект, я получил это сообщение об ошибке: Целевым типом этого выражения должен быть функциональный интерфейс

public Animal createAnimal(boolean isDangerous) {
        return isDangerous ? Shark::new : Cat::new;
    }

Есть ли однострочное решение для первый блок?

Ответы [ 2 ]

5 голосов
/ 10 июля 2020

Есть ли однострочное решение для первого блока?

Да, вы слишком много думаете:

return isDangerous ? new Shark() : new Cat();

Операнды условного оператора оцениваются только при необходимости, поэтому будет создан только один экземпляр.

Я получил это сообщение об ошибке: Целевым типом этого выражения должен быть функциональный интерфейс.

Это потому, что вы фактически возвращаете не Animal, а скорее ссылку на метод к вещи, которая не принимает аргументов и возвращает Animal. Итак, вы могли бы написать (среди прочего):

public Supplier<Animal> createAnimal(boolean isDangerous) {
    return isDangerous ? Shark::new : Cat::new;
}
4 голосов
/ 10 июля 2020

Самый простой однострочник, который я мог придумать

public Animal createAnimal(boolean isDangerous) {
    return isDangerous ? new Shark() : new Cat();
}
...