三元运算符中的构造函数引用 Java 8

Constructor Reference in a ternary operator Java 8

我想用一行 return 语句替换 if-else 函数,我想知道为什么我不能通过三元运算符中的构造函数引用创建对象?

我想用这样的东西代替:

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

但是如果我想 return 那里有一个对象,我会得到这个错误消息:这个表达式的目标类型必须是一个函数式接口

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

是否有第一个块的单行解决方案?

Is there a one-liner solution for the first block?

是的,你想多了:

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

条件运算符的操作数仅在需要时进行评估,因此这只会创建一个实例。


I got this error message: The target type of this expression must be a functional interface

那是因为你实际上并没有返回一个 Animal,而是一个方法引用,它不带任何参数和 returns 一个 Animal。所以,你可以写(除其他外):

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

我能想到的最简单的一行代码

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