如何在Java中定义和调用内联lambda表达式

如何在Java中定义和调用内联lambda表达式,lambda,java-8,Lambda,Java 8,我想这样做: { param -> if ( <condition over param> ) process ( param ) } ( provider () ); {param->if()进程(param)}(提供者()); i、 例如,param是一个方法返回的值(比如说,它需要很长时间才能运行,所以我只想调用它一次),并且我只想在它满足条件时传递这个值 另一种选择是: Param param = provider(); if ( <cond> ) pr

我想这样做:

{ param -> if ( <condition over param> ) process ( param ) } ( provider () );
{param->if()进程(param)}(提供者());
i、 例如,param是一个方法返回的值(比如说,它需要很长时间才能运行,所以我只想调用它一次),并且我只想在它满足条件时传递这个值

另一种选择是:

Param param = provider(); if ( <cond> ) process ( param );
Param Param=provider();if()进程(param);

但是基于lambda的版本,如果我能让它工作的话,会更短。上面的代码不是用Java编译的,我无法确定我所想的是否可能以及如何实现。

如果不知道您的具体情况,我同意JB Nizet的评论,即替代解决方案更可取。除此之外,要将其写成lambda表达式,只需更改一些标点符号。此外,lambda表达式实现的函数接口必须是已知的,例如
java.util.function.Consumer

    Consumer<Param> consumer = param -> { if ( !"".equals ( param ) ) process ( param ); };
    consumer.accept(provider());
Consumer=param->{if(!“”.equals(param))进程(param);};
consumer.accept(provider());

好吧,你可以这样做

                                        // use Type::process for a static method
Stream.of(provider()).filter( «cond» ).forEach(this::process);
虽然在这里使用一个普通的命令式语句并没有什么好处

如果要限制新引入变量的范围,可以创建块

{ Param param = provider(); if( «cond» ) process(param); }

另外,作为补充说明,使用这种传统结构进行调试将更加容易。

谢谢大家的回复。我发现了一种类似于@Holger建议的方法:

Optional.of ( provider() ).map ( v -> { if ( <cond> ) process ( v ); return null; } )
Optional.of(provider()).map(v->{if()进程(v);返回null;})

(仅当process()返回void时才需要返回)。我同意定义一个中间变量会更快,也许我最终会这么做。然而,一定有一些心理原因让我更喜欢上面提到的函数形式。当它们很多时,编写起来似乎更快,可能是因为您不需要考虑新的变量名(如果涉及不同的类型,则需要多个变量定义)。

下面的完整示例程序的语法与您所说的非常接近。这取决于可用于其他类似场景的通用“invoke”函数。lambda的主体需要放在大括号中,因为它是一个语句,而不是一个表达式。该示例具有字符串参数类型,但可以是任何类型

import java.util.function.Consumer;

public class invoke_lambda_directly
{
    void run()
    {
        invoke(param -> { if (param.equals("x")) process(param); }, provider() );
    }

    private void process(String p) { System.out.println("processed " + p); }

    private String provider() { return "x"; }

    public static <T> void invoke(Consumer<T> i, T t) { i.accept(t); }

    public static void main(String args[])
    {
        new invoke_lambda_directly().run();
    }
}
import java.util.function.Consumer;
公共类直接调用\u lambda\u
{
无效运行()
{
调用(param->{if(param.equals(“x”))进程(param);},provider());
}
私有void进程(字符串p){System.out.println(“已处理”+p);}
私有字符串提供程序(){return“x”;}
公共静态无效调用(使用者i,tt){i.accept(T);}
公共静态void main(字符串参数[])
{
新建直接调用lambda_().run();
}
}

正如您的问题所示,编译的备选方案实际上更短。而且更清楚。
永远不等于
Param
的实例。此外,
process
似乎在一个变量中使用了一个参数,但在另一个变量中没有参数……是的,对不起,我将重写它。“更短”,我不知道为什么我觉得类似于第一个表单的东西看起来更好,尤其是当我有很多类似的东西时。也许我开始沉迷于函数编程、闭包之类的东西:-)这很好,但我的问题基本上是如何使用lambdas来定义一个函数并立即调用它,而不需要太多的定义。唯一的依赖是一行“invoke”函数。我会把它放在库中类似“Lambdas”的类中,并在任何想要直接调用“Consumer”lambda的类的顶部添加一个“import static org.mine.utility.Lambas.invoke”。是的,这很有趣。我在想,有时我需要为多参数lambda执行此操作,但也可以在实用方法中进行安排。谢谢