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 ());