【问题标题】:Java 8 - how do I declare a method reference to an unbound non-static method that returns voidJava 8 - 如何声明对返回 void 的未绑定非静态方法的方法引用
【发布时间】:2017-10-07 01:14:06
【问题描述】:

这是一个简单的类来说明我的问题:

package com.example;

import java.util.function.*;

public class App {

    public static void main(String[] args) {
        App a1 = new App();

        BiFunction<App, Long, Long> f1 = App::m1;
        BiFunction<App, Long, Void> f2 = App::m2;

        f1.apply(a1, 6L);
        f2.apply(a1, 6L);
    }

    private long m1(long x) {
        return x;
    }

    private void m2(long x) {
    }
}

f1,引用App::m1,并在f1apply 的调用中绑定到a1,工作得非常好——编译器很高兴,并且可以通过 f1.apply 进行调用正好。

f2,引用App::m2,不起作用。

我希望能够定义对没有返回类型的未绑定非静态方法的方法引用,但我似乎无法使其工作。

【问题讨论】:

  • 又一个受害者void != Void :)

标签: java java-8 java-stream void method-reference


【解决方案1】:

BiFunction 表示一个函数,它接受两个参数并产生一个结果

我希望能够定义对未绑定的方法引用 没有返回类型的非静态方法

使用BiConsumer 代替它表示接受两个输入参数的操作并且不返回任何结果

BiConsumer<App, Long> f2 = App::m2;

然后改变这个:

f2.apply(a1, 6L);

到这里:

f2.accept(a1, 6L);

【讨论】:

    【解决方案2】:

    方法引用是 App::m2,就像你有的一样,但它不能分配给 BiFunction,因为它不返回值,甚至是 Void 值(必须是 null)。你必须这样做:

    f2 = (a,b) -> { m2(a,b); return null; }
    

    如果你想要一个 BiFunction。或者,您可以使用其他答案中提到的 BiConsumer 。

    【讨论】:

      猜你喜欢
      • 2018-11-25
      • 1970-01-01
      • 1970-01-01
      • 2016-12-14
      • 1970-01-01
      • 2013-06-30
      • 1970-01-01
      • 2023-03-23
      • 2012-03-24
      相关资源
      最近更新 更多