Java 8传递方法作为参数

Tor*_*mer 67 java lambda java-8 method-reference

目前正在进入Java 8 lambda表达式和方法引用.

我想传递一个没有args且没有返回值的方法作为另一个方法的参数.这就是我这样做的方式:

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();
}
Run Code Online (Sandbox Code Playgroud)

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

Joo*_*gen 57

真的没关系; Runnable也会这样做.

Consumer<Void>,
Supplier<Void>,
Function<Void, Void>
Run Code Online (Sandbox Code Playgroud)

  • `Runnable`是最好的.使用`Supplier <Void>`或`Function <Void,Void>`,您可能被迫提供`null`作为返回值(因为返回类型是'Void`而不是'void`),并且对于`Consumer <Void >`你可能要声明一个伪参数. (14认同)
  • 这些接口的问题在于它们没有语义; 它们完全是结构性的.语义来自于它们的使用方式.由于它们可以以多种不同的方式使用,因此命名它们非常困难.对于接受一个事件并返回void的接口来说,调用`Action`而不是`Consumer <Event>`会很有意义,但是`Action`在其他上下文中没有意义.因此,大多数选择名称来反映结构,即参数传递和返回的值. (6认同)

obe*_*bey 40

你也可以像这样传递lambda:

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

public void run(Runnable function) {
    function.run();
}
Run Code Online (Sandbox Code Playgroud)

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