2017-10-03 3 views
-1

Ma situation:Java 8: Comment utiliser une méthode statique en tant que paramètre pour une autre méthode?

class Test { 
    private static void xxx(String s) throws SQLException { 
     System.out.println(s); 
    } 
    private static void yyy(Consumer<String> f) { 
     try { 
      f.apply('hello'); 
     } catch (SQLException e) { 
      System.out.println("error"); 
     } 
    } 
    public static void main(String args[])() { 
     yyy(xxx); // <-- not working!! 
    } 
} 

Ce que je suis en train de faire est d'adopter une méthode statique comme paramètre pour une autre méthode statique. Je pense que la façon correcte de déclarer la signature de la méthode yyy est avec Consumer, mais je ne suis pas vraiment sûr de l'autre partie, en passant xxx comme paramètre.

Une solution que j'ai trouvé est d'écrire

yyyy(s -> xxx(s)); 

Mais il semble laid et il ne fonctionne pas vraiment si xxx émet des exceptions.

En utilisant

yyy(Test::xxx); 

J'ai eu cette erreur

error: incompatible thrown types SQLException in method reference 
+2

Une référence correcte à un membre statique (champ, méthode, classe imbriquée ...) doit inclure le nom de la classe. Ainsi 'Test :: xxx', pas' xxx'. – RealSkeptic

Répondre

2

Vous pouvez utiliser une référence de méthode:

class Test { 
    private static void xxx(String s) { 
     //do something with string 
    } 
    private static void yyy(Consumer<String> c) { 
     c.accept("hello"); 
    } 
    public static void zzz() { 
     yyy(Test::xxx); 
    } 
} 
+0

Merci beaucoup! Il y avait des détails supplémentaires que j'essayais d'utiliser, je peux modifier la question. Si xxx déclenche une exception, devrais-je modifier la déclaration de _Consumer_? Parce que ça me donne toujours une erreur à cause de ça. – heapOverflow

+0

@heapOverflow Si vous lancez une exception non cochée, vous éviterez cette erreur. – Eran

+0

Malheureusement dans mon cas c'est une exception vérifiée (SQLException) donc ce n'est pas vraiment mon choix. Bien sûr, je pourrais essayer d'attraper mais j'essayais d'éviter cela. – heapOverflow

1

Vous pouvez ci-dessous le code

class Test { 
    private static Consumer<String> xxx(String s) { 
     //do something with string 
     return null;// return Consumer for now passing null 
    } 

    private static void yyy(Consumer<String> f) { 
     //do something with Consumer 
    } 

    public static void zzz(){ 
     yyy(xxx("hello")); 
    } 
}