Java 8 - 如何声明对返回void的未绑定非静态方法的方法引用

时间:2017-10-07 01:14:07

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

这是一个简单的课程,说明了我的问题:

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,并且a1调用f1时绑定到apply,效果非常好 - 编译器很开心并且可以通过f1.apply进行调用。

f2,指的是App::m2,不起作用。

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

2 个答案:

答案 0 :(得分:11)

<div class="image-circle"> <div> <img class="img" src="https://cdn.pbrd.co/images/GNK97WG.png"> </div> </div> .image-circle { width:25%; } .image-circle:after { content: ""; background: #4679BD; padding-bottom: 100%; border-radius: 50%; display: block; width: 100%; height:0; -moz-border-radius: 50%; -webkit-border-radius: 50%; } .image-circle div { float:left; width:100%; line-height:1em; margin-top:-0.5em; padding-top:40%; text-align:center; } 表示接受两个参数的函数 nd生成结果

  

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

使用BiFunction代替一个接受两个输入参数并且不返回结果的操作

BiConsumer

然后改变这个:

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

到此:

f2.apply(a1, 6L);

答案 1 :(得分:3)

方法参考是App :: m2,就像你一样,但它不能分配给BiFunction,因为它不会返回一个值,即使是一个Void值(必须是{ {1}})。你必须这样做:

null

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