三元运算符中的构造函数引用 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();
}
我想用一行 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();
}