2017-09-19 3 views
1

Je travaille/teste des flux dans Java8 et rencontre un problème très frustrant. J'ai le code qui compile bien:Accolades supplémentaires dans la fonction Java map()

 List<String> words = Arrays.asList("Oracle", "Java", "Magazine"); 
    List<String> wordLengths = words.stream().map((x) -> x.toUpperCase()) 
     .collect(Collectors.toList()); 

et deuxième (presque le même) qui jettent un avertissement:

 List<String> words = Arrays.asList("Oracle", "Java", "Magazine"); 
    List<String> wordLengths = words.stream().map((x) -> { 
     x.toUpperCase(); 
    }).collect(Collectors.toList()); 

Attention:

The method map(Function<? super String,? extends R>) in the type Stream<String> is not applicable for the arguments ((<no type> x) -> {}) 

Qu'est-ce que les crochets supplémentaires ont-ils changé?

+1

Si vous utilisez les crochets et le type de retour du lambda n'est pas vide, vous vous fournissez le mot-clé 'return' dans le corps lambda (voir aussi https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-LambdaBody) –

+1

ce n'est pas un 'avertissement' mais un problème de compilation, * entièrement * des choses différentes – Eugene

Répondre

3

Votre expression lambda renvoie une valeur. Si vous utilisez les supports que vous devez ajouter une déclaration de retour à votre fonction lambda:

List<String> words = Arrays.asList("Oracle", "Java", "Magazine"); 
List<String> wordLengths = words.stream().map((x) -> { 
    return x.toUpperCase(); 
}).collect(Collectors.toList()); 
2

Selon le responsable Oracle tutorial

Une expression lambda se compose des éléments suivants:

A séparés par des virgules liste des paramètres formels entre parenthèses. La méthode CheckPerson.test contient un paramètre, p, lequel représente une instance du Person class.

Remarque: Vous pouvez omettre le type de données des paramètres dans une expression lambda . En outre, vous pouvez omettre les parenthèses s'il n'y a qu'un seul paramètre: . Par exemple, l'expression lambda suivante est également valide :

p -> p.getGender() == Person.Sex.MALE 
    && p.getAge() >= 18 
    && p.getAge() <= 25 

Le jeton flèche, ->

Un corps, qui consiste en une seule expression ou d'un bloc d'instruction. Cet exemple utilise l'expression suivante:

p.getGender() == Person.Sex.MALE 
    && p.getAge() >= 18 
    && p.getAge() <= 25 

Si vous spécifiez une seule expression, l'environnement d'exécution Java évalue l'expression puis retourne sa valeur. Vous pouvez également utiliser une instruction return:

p -> { 
    return p.getGender() == Person.Sex.MALE 
     && p.getAge() >= 18 
     && p.getAge() <= 25; 
} 

Une déclaration de retour est une expression; dans une expression lambda, vous devez inclure des instructions entre accolades ({}). Toutefois, vous ne devez pas joindre une invocation de méthode void entre accolades. Par exemple, le suivant est une expression lambda valide:

email -> System.out.println(email) 

Comme il n'y a qu'un seul paramètre dans l'expression lambda fourni (x) -> x.toUpperCase() on peut omettre les parenthèses: x -> x.toUpperCase(). String#toUpperCase renvoie un nouveau String donc il n'est pas nécessaire d'utiliser return instruction et accolades. Si à la place nous avions un bloc complexe avec des instructions de retour, nous devions le placer entre accolades.En outre, dans ce cas, il est préférable d'utiliser Method ReferenceString::toUpperCase

List<String> wordLengths = words.stream().map(String::toUpperCase).collect(Collectors.toList());