【问题标题】:Constructor Reference in a ternary operator Java 8三元运算符Java 8中的构造函数参考
【发布时间】:2020-10-31 04:27:56
【问题描述】:

我想用单行返回语句替换 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

但是如果我想在那里返回一个对象,我得到了这个错误信息:这个表达式的目标类型必须是一个函数式接口

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

第一个块有单线解决方案吗?

【问题讨论】:

  • 您认为Shark::new 能给您带来什么?提示:不是Shark 的实例。
  • zoo.getAnimals().stream().findAny().orElseGet(isDangerous : Shark::new : Cat::new); 有效,不知道您期待什么?
  • return isDangerous ? new Shark() : new Cat();?

标签: java lambda java-8 conditional-operator


【解决方案1】:

第一个块有单线解决方案吗?

是的,你想多了:

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

条件运算符的操作数仅在需要时才计算,因此只会创建一个实例。


我收到此错误消息:此表达式的目标类型必须是函数式接口

那是因为您实际上并没有返回 Animal,而是对不带参数并返回 Animal 的事物的方法引用。所以,你可以写(除其他外):

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

【讨论】:

  • 哇,谢谢,这就是我要找的! Supplier&lt;Animal&gt; animal = isDangerous ? Shark::new : Cat::new;我还没有足够的声誉来投票:)
  • 但你最终应该也能接受这个答案。
【解决方案2】:

我能想到的最简单的单线

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

【讨论】:

    猜你喜欢
    • 2013-12-02
    • 1970-01-01
    • 2012-04-16
    • 2017-09-27
    • 2015-09-29
    • 1970-01-01
    • 2012-10-15
    • 1970-01-01
    相关资源
    最近更新 更多