2017-10-07 65 views
10

Oto proste klasy, który ilustruje mój problem:Java 8 - jak mogę zadeklarować referencję metodę niezwiązaną metody non-statycznego zwracającej 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, odnosząc się do App::m1 i wiążąc się a1 w rozmowie f1 do apply, działa idealnie dobrze - kompilator jest zadowolony, a połączenie można wykonać za pośrednictwem f1.apply po prostu w porządku.

f2, odnosząc się do App::m2, nie działa.

Chciałbym móc zdefiniować odwołanie metody do niezwiązanej metody niestatycznej bez typu zwracanego, ale nie mogę sprawić, żeby działało.

+0

Kolejna ofiara 'void! = Void' :) – Dariusz

Odpowiedz

11

reprezentuje funkcję, która przyjmuje dwa argumenty, a nd daje wynik.

ja jak móc określić metodą referencyjną do niezwiązanego metodą niestatycznych bez typu powrotnej

użyć BiConsumer zamiast co stanowi operację, która przyjmuje dwa parametry wejściowe i nie zwraca wyniku.

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

następnie zmienić:

f2.apply(a1, 6L); 

do tego:

odniesienia
f2.accept(a1, 6L); 
3

Metoda jest App :: m2, tak jak trzeba, ale to nie jest przypisane do BiFunction, ponieważ nie zwraca wartości, nawet wartości Void (która musi być null). Trzeba by zrobić:

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

jeśli chcesz BiFunction. Alternatywnie możesz użyć BiConsumer, jak wspomniano w innych odpowiedziach.