Java 8 pass方法作为参数


69

当前正在学习Java 8 lambda表达式和方法参考。

我想将不带参数且没有返回值的方法作为参数传递给另一个方法。这就是我的做法:

public void one() {
    System.out.println("one()");
}

public void pass() {
    run(this::one);
}

public void run(final Function function) {
    function.call();
}

@FunctionalInterface
interface Function {
    void call();
}

我知道有一组预定义功能接口的java.util.function,如Function<T,R>,但我没有找到一个不带任何参数,而不是产生结果。


6
真的没关系;Runnable也会这样做。Supplier<Void>, Function<Void, Void>
乔普·艾根

哦,是的,老旧的Runnable ...我知道我错过了一些明显的事情!您应该回答这个问题,因为您已经回答了我的问题:-)
TorstenRömer,2014年

Answers:


61

真的没关系;Runnable也会做。

Consumer<Void>,
Supplier<Void>,
Function<Void, Void>

14
Runnable是最好的。使用Supplier<Void>Function<Void,Void>可能会被迫提供null返回值(因为返回类型Void不是void),并且Consumer<Void>可能必须声明一个哑元。
斯图尔特(Stuart Marks)

1
@StuartMarks,该评论肯定会帮助其他人根据自己的风格进行选择。很奇怪,没有java.util.Action / SideEffect左右。所以。
乔普·艾根

6
这些接口的问题在于它们没有语义。它们完全是结构性的。语义来自如何使用它们。由于可以使用许多不同的方式,因此很难命名它们。对于接受事件并返回voidAction而不是调用Consumer<Event>Action在其他上下文中没有意义的接口,这将是很有意义的。因此,名称的选择主要是为了反映结构,即参数传递和返回值。
Stuart Marks 2014年

@StuartMarks同意,因为lambda通常是匿名使用的,甚至_(下划线)也可以用作函数名称。总的来说,它Function是一个很好的中性包罗万象,尽管Void错过了void作为返回值和()作为参数值。
乔普·艾根

42

您也可以像这样传递lambda:

public void pass() {
    run(()-> System.out.println("Hello world"));
}

public void run(Runnable function) {
    function.run();
}

这样,您直接将lambda作为方法传递。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.