问题 在Java中使用Supplier有什么好处?


阅读新的 Supplier 界面我看不出它的用法有什么好处。 我们可以看到它的一个例子。

class Vehicle{
  public void drive(){ 
    System.out.println("Driving vehicle ...");
  }
}
class Car extends Vehicle{
  @Override
  public void drive(){
    System.out.println("Driving car...");
  }
}
public class SupplierDemo {   
  static void driveVehicle(Supplier<? extends Vehicle> supplier){
    Vehicle vehicle = supplier.get();
    vehicle.drive();   
  }
}
public static void main(String[] args) {
  //Using Lambda expression
  driveVehicle(()-> new Vehicle());
  driveVehicle(()-> new Car());
}

正如我们在那个例子中看到的那样 driveVehicle 方法期望一个 Supplier 作为论点。 为什么我们不改变它以期待一个 Vehicle

public class SupplierDemo {   
  static void driveVehicle(Vehicle vehicle){
    vehicle.drive();   
  }
}
public static void main(String[] args) {
  //Using Lambda expression
  driveVehicle(new Vehicle());
  driveVehicle(new Car());
}

使用的优点是什么? Supplier

编辑: 关于这个问题的答案 Java 8供应商和消费者对外行的解释 没有解释使用的好处 Supplier。 有评论询问,但没有回答。

这有什么好处而不是直接调用方法?   是因为供应商可以像中间人那样行事并交出来   那个“回归”的价值?


2891
2017-11-27 15:53


起源

FWIW: driveVehicle(Vehicle::new) - a better oliver
有人可以评论问题的最后部分 - “这有什么好处而不是直接调用这个方法?”? - pMan
@pMan供应商很有用,因为只有在必要时才会调用它。例如,if(condition){doStuff(supplier.get()); } - hbelmiro
看一眼 docs.oracle.com/javase/8/docs/api/java/util/logging/... 你明白了 - hbelmiro


答案:


在上面的示例中,我不使用供应商。你正在服用 Vehicle 开车,不要求车辆。

但是要回答你的一般问题:

  • 因为建造汽车很昂贵,我们不想这样做,直到我们确实需要。
  • 因为我们想要 X 汽车不只是一个。
  • 因为建造汽车的时间很重要。
  • 因为施工很复杂所以我们想把它包起来。
  • 因为我们在返回之前不知道要返回哪辆车(也许它会是新车,也许是回收车,也许是包装纸,谁知道)

10
2017-11-27 15:54



在这种情况下,这没有任何意义。 - Philipp Sander
@mlk我一般都在问。你的答案是有效的。谢谢。 - hbelmiro