2017-10-07 102 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。