2017-10-07 8 views
10

est ici une classe simple qui illustre mon problème:Java 8 - comment puis-je déclarer une référence de méthode pour une méthode non liée non-statique qui retourne 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, se référant à App::m1, et être lié à a1 dans f1 appel à apply, fonctionne parfaitement bien - le compilateur est heureux et l'appel peut être fait via f1.apply très bien.

f2, en se référant à App::m2, ne fonctionne pas. Je voudrais pouvoir définir une référence de méthode à une méthode non statique non liée sans type de retour, mais je n'arrive pas à la faire fonctionner.

+0

Encore une autre victime de 'void! = Void' :) – Dariusz

Répondre

11

BiFunction représente une fonction qui accepte deux arguments et produit un résultat.

je voudrais être en mesure de définir une référence de procédé à un non lié méthode non statique avec aucun type de retour

utiliser un BiConsumer place ce qui représente une opération qui accepte deux arguments d'entrée et renvoie aucun résultat.

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

changer alors ceci:

f2.apply(a1, 6L); 

à ceci:

f2.accept(a1, 6L); 
3

La référence de la méthode est App :: m2, tout comme vous, mais pas cessible à un BiFunction, car il ne renvoie pas de valeur, même une valeur vide (qui doit être null). Vous auriez à faire:

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

si vous voulez une BiFunction. Alternativement, vous pouvez utiliser un BiConsumer comme mentionné dans d'autres réponses.