使用java 8供应商传递功能代码

时间:2017-06-17 21:21:16

标签: java functional-programming java-8

我试图理解Java 8中的lambdas。我有一个使用功能界面的非常简单的例子。

这不是一个有效的例子,我知道我可以直接拨打method1method2,而不是使用getValue()Supplier,但我想知道是否使用method1调用method2supplier.get()时会遇到任何问题。

public <T> T mytest(SomeObject var) {
    //extract values from someobject
    if(somecondition) {
        getValue(() ->  method2(obj5instance, obj6instance));
    } else {
        getValue(() ->  method1("somestr", obj1instance, obj2instance, obj3instance));
    }
}

private String method1(String s1, Obj1 s2, Obj2 s3, Obj3 s4){
    //network call here to compute return value
    return "computedmethod1";
}

private String method2(Obj5 s2, Obj6 s3){
    //network call here to compute return value
    return "computedmethod2";
}

public <T> T getValue(Supplier<T> supplier){    
    //this will call method1 or method2
    //wrap the return value from supplier.get and return
    return supplier.get();
}

根据安德鲁的评论更新。

这很有道理,谢谢。我很难理解供应商的概念。

C1.java

public C3 m1(Obj obj){      
  Supplier<String> mysupplier = () -> foo(arg1, arg2, arg3);       //foo is an expensive call
return someFn(mysupplier);    
} 

供应商如何在内部工作?创建供应商时,它是否保留对foo()的引用以及传递给foo的参数?

public C3 someFn(Supplier<String> supplier){   
//this returns an instance of C3 that has a method lazyCall() which runs supplier.get()   
}    

C2.java

C3 c3 = c1.m1(obj); 

如果和何时调用c3.lazyCall(),它将运行supplier.get()并运行foo。这是供应商的有效用途吗?

1 个答案:

答案 0 :(得分:4)

Supplier接口的一个优点是以懒惰的方式提供值。

我们尝试尽可能地延迟supplier.get()调用,因为在真正需要执行的时刻执行资源消耗操作(如果有的话)更好,避免出现结果操作可以忽略或可以跳过。

这里,Supplier上的包装是没有意义的,因为没有条件可能无法被调用。此外,我没有看到为什么这些方法应该懒惰地执行的任何原因。虽然,我也没有看到整个过程。

编辑:

  

supplier如何在内部运作?创建supplier时,是否保留对foo()的引用以及传递给foo的参数?

将lambda表达式想象为匿名类声明的快捷方式(实际上是这样),并覆盖单个方法。在lambda体中,您只需编写方法代码,该代码将在调用时执行。

不,它不会保留引用,因为它可以直接访问它们(有一些限制,如有效的最终变量)。