使用Java8传递函数代码

使用Java8传递函数代码,java,functional-programming,java-8,Java,Functional Programming,Java 8,我试图理解Java8中的lambdas。我有一个使用函数接口的非常简单的示例 这不是一个工作示例,我知道我可以直接调用method1和method2,而不是使用getValue和Supplier,但是,我想知道使用Supplier.get调用method1和method2是否有任何问题 如果调用c3.lazyCall,则运行supplier.get并运行foo。这是对供应商的有效使用吗?供应商界面的优点之一是以惰性的方式提供价值 我们尝试尽可能延迟supplier.get调用,因为如果在确实需要

我试图理解Java8中的lambdas。我有一个使用函数接口的非常简单的示例

这不是一个工作示例,我知道我可以直接调用method1和method2,而不是使用getValue和Supplier,但是,我想知道使用Supplier.get调用method1和method2是否有任何问题


如果调用c3.lazyCall,则运行supplier.get并运行foo。这是对供应商的有效使用吗?

供应商界面的优点之一是以惰性的方式提供价值

我们尝试尽可能延迟supplier.get调用,因为如果在确实需要执行资源消耗操作时执行该操作,则最好执行该操作,以避免忽略或跳过该操作的结果

在这里,对供应商的包装是毫无意义的,因为在任何情况下它都可能被调用。此外,我不认为有任何理由可以懒散地执行这些方法。不过,我看不到整个过程

编辑:

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

将lambda表达式看作是匿名类声明的快捷方式,因为它实际上是重写单个方法的。在lambda主体中,您只需编写方法代码,该代码将在被调用时执行


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

您的mytest没有返回语句。它无法编译。你能澄清你所说的任何问题是什么意思吗?由于此问题当前已编写,因此它似乎是一个基于意见的问题,适用于此网站。假设要返回getValue,则使用的是泛型,但所有lambda仅返回字符串。这只在T始终是字符串的情况下才起作用。我理解代码无法编译,我的重点是理解如何正确使用供应商。我认为你想得太多了。功能接口只是一个具有单个方法的接口,该方法可以由实现该方法签名的任何代码实现。与“Supplier”类似的是任何返回Foo的代码。就像一个具体的类方法一样,代码是在调用该方法时执行的,而不是在定义该方法时执行的。对不起,这个复杂的例子。
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();
}
public C3 m1(Obj obj){      
  Supplier<String> mysupplier = () -> foo(arg1, arg2, arg3);       //foo is an expensive call
return someFn(mysupplier);    
} 
public C3 someFn(Supplier<String> supplier){   
//this returns an instance of C3 that has a method lazyCall() which runs supplier.get()   
}    
C3 c3 = c1.m1(obj);