5
votes

La collecte de cartes à l'aide du flux génère une erreur de compilation étrange

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


0 commentaires

3 Réponses :


1
votes

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)'


0 commentaires

3
votes

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


1 commentaires

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



1
votes

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


2 commentaires

où est le plaisir là-dedans? :)


ce serait bien d'appeler this.fields.addAll (fields.map (v -> v.getValue ());