我试图理解Java 8中的lambdas。我有一个使用功能界面的非常简单的例子。
这不是一个有效的例子,我知道我可以直接拨打method1
和method2
,而不是使用getValue()
和Supplier
,但我想知道是否使用method1
调用method2
和supplier.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。这是供应商的有效用途吗?
答案 0 :(得分:4)
Supplier
接口的一个优点是以懒惰的方式提供值。
我们尝试尽可能地延迟supplier.get()
调用,因为在真正需要执行的时刻执行资源消耗操作(如果有的话)更好,避免出现结果操作可以忽略或可以跳过。
这里,Supplier
上的包装是没有意义的,因为没有条件可能无法被调用。此外,我没有看到为什么这些方法应该懒惰地执行的任何原因。虽然,我也没有看到整个过程。
编辑:
supplier
如何在内部运作?创建supplier
时,是否保留对foo()
的引用以及传递给foo的参数?
将lambda表达式想象为匿名类声明的快捷方式(实际上是这样),并覆盖单个方法。在lambda体中,您只需编写方法代码,该代码将在调用时执行。
不,它不会保留引用,因为它可以直接访问它们(有一些限制,如有效的最终变量)。