web-dev-qa-db-fra.com

Comment attribuer un lambda à une variable dans Java 8?

Il suffit de jouer avec le nouveau lambda et les fonctionnalités de Java 8 et je ne sais pas comment faire.

Par exemple, ce qui suit est valide:

    Map<String, Integer> map = new HashMap<>();
    map.put("A", 1);
    map.put("B", 2);
    map.put("C", 3);
    map.compute("A", (k, v) -> v == null ? 42 : v + 41));

mais ce qui suit me donne des erreurs de syntaxe:

    BiFunction x = (k, v) -> v == null ? 42 : v + 41;
    map.compute("A", x);

Des idées?

44
sproketboy

Vous avez oublié les génériques sur votre BiFunction:

public static void main(final String[] args) throws Exception {
    final Map<String, Integer> map = new HashMap<>();
    map.put("A", 1);
    map.put("B", 2);
    map.put("C", 3);
    final BiFunction<String, Integer, Integer> remapper = (k, v) -> v == null ? 42 : v + 41;
    map.compute("A", remapper);
}

Fonctionnement:

PS C:\Users\Boris> Java -version
Java version "1.8.0-ea"
Java(TM) SE Runtime Environment (build 1.8.0-ea-b120)
Java HotSpot(TM) 64-Bit Server VM (build 25.0-b62, mixed mode)
40
Boris the Spider

Comme le souligne Boris The Spider, le problème spécifique que vous rencontrez est celui des génériques. Selon le contexte, l'ajout d'un bloc {} explicite autour du lambda aidera à ajouter de la clarté et peut être requis.

Avec cela, vous obtiendriez quelque chose comme:

BiFunction<String, Integer, Integer> x = (String k, Integer v) -> {v == null ? 42 : v + 41};

Il serait très utile pour les futurs lecteurs qui ont le même problème si vous publiez vos erreurs de syntaxe afin qu'elles puissent être indexées.

Ce lien a quelques exemples supplémentaires qui pourraient vous aider.

3
JBCP

exemple de passage d'un lambda contenant une méthode

YourClass myObject = new YourClass();

// first parameter, second parameter and return 
BiFunction<String, YourClass, String> YourFunction; 

YourFunction = (k, v) -> v == null ? "ERROR your class object is null" : defaultHandler("hello",myObject);

public String defaultHandler(String message, YourClass Object)
{
     //TODO ...

     return "";
}
2
serup