J'ai cette méthode:
class TableField {
public String getKey() {
return this.key;
}
public String getValue() {
return this.value;
}
}
et TableField est simple ressemble juste à:
public void fields(TableField... s){
// compilation error on next line
Collection<String> fields = Arrays.asList(s).stream().map(v -> v.getValue());
this.fields.addAll(fields);
}
mais je vois cette erreur de compilation:
Types incompatibles. Collection requise mais "map" a été déduite vers Stream: aucune instance (s) de type variable (s) R n'existe de sorte que Le flux est conforme à la collection
3 Réponses :
Vous devez collecter les éléments là-bas et donc le type serait déduit:
Collection<String> fields = Arrays.stream(s) // Arrays.asList(s).stream()
.map(TableField::getValue) // map(v -> v.getValue())
.collect(Collectors.toList()); // or any other collection using 'Collectors.toCollection(<type>::new)'
map renvoie un Stream transformé. Si vous voulez une collection, vous devez collecter le Stream. Par exemple :
Collection<String> fields =
Arrays.asList(s).stream().map(v -> v.getValue()).collect(Collectors.toList());
@MrCholo vous pouvez réduire le nombre de lettres en utilisant Arrays.stream (s) au lieu de Arrays.asList (s) .stream () . De plus, vous pouvez omettre la variable locale temporaire, fields.addAll (Arrays.stream (s) .map (v -> v.getValue ()). Collect (Collectors.toList ())) . Ou l'inverse, Arrays.stream (s) .forEachOrdered (v -> fields.add (v.getValue ()));
Il est inutile d'utiliser des flux ici. Une simple boucle for traditionnelle donnerait un code plus succinct et beaucoup plus performant:
for (v : s) fields.add(v.getValue());
où est le plaisir là-dedans? :)
ce serait bien d'appeler this.fields.addAll (fields.map (v -> v.getValue ());