2017-10-07 108 views
10

这里有一个简单的类,说明我的问题未绑定的非静态方法:的Java 8 - 我怎么声明的方法引用返回void

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,并且被绑定到a1f1的号召,apply,工作完全正常 - 编译器是幸福的呼叫可以通过f1.apply就好制成。

f2,指App::m2,不能正常工作。

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

+0

还有的另一个受害者'无效!= Void' :) – Dariusz

回答

11

BiFunction表示接受两个参数的函数nd产生结果

我想能够定义的方法参照未绑定 非静态方法没有返回类型

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

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

然后改变这一点:

f2.apply(a1, 6L); 

这样:

f2.accept(a1, 6L); 
3

的方法引用是应用::平方米,就像你有,但它不是分配给一个双功能,因为它没有返回值,即使是空值(它必须是null)。你必须这样做:

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

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