4
votes

Impression de certains champs des objets d'un flux filtré

Supposons qu'il existe une classe Fox, qui a un nom, une couleur et un âge. Supposons que j'ai une liste de renards et que je veux imprimer les noms de ces renards, dont les couleurs sont vertes. Je souhaite utiliser des flux pour ce faire.

Champs:

  • nom: chaîne privée
  • couleur: chaîne privée
  • age: entier privé

J'ai écrit le code suivant pour faire le filtrage et Sysout:

foxes.stream().filter(fox -> fox.getColor().equals("green"))
     .forEach(fox -> System.out::println (fox.getName()));

Cependant, il y a quelques problèmes de syntaxe dans mon code.

Quel est le problème? Comment dois-je régler le problème?


1 commentaires

Soit .forEach (fox -> System.out.println (fox.getName ())); ou .map (Fox :: getname) .forEach (System.out :: println) ;


3 Réponses :


9
votes

Vous ne pouvez pas combiner des références de méthode avec des lambdas, utilisez simplement l'une:

foxes.stream()
     .filter(fox -> fox.getColor().equals("green"))
     .map(Fox::getName) // required in order to use method reference in the following terminal operation
     .forEach(System.out::println);

ou l'autre:

foxes.stream()
     .filter(fox -> fox.getColor().equals("green"))
     .forEach(fox -> System.out.println(fox.getName()));


1 commentaires

@Csongi Nagy Qu'est-ce qu'une référence de méthode? Un moyen de remplacer / raccourcir l'écriture lambda. Vous pouvez donc l'utiliser à la place d'un lambda, jamais avec un lambda. Notez également que tous les lambdas ne peuvent pas être remplacés par une référence de méthode. L'exemple Aomine montre comment vous pourriez rendre cela possible pour vos besoins.



8
votes

Utilisez simplement:

foxes.stream().filter(fox -> fox.getColor().equals("green"))
              .forEach(fox -> System.out.println(fox.getName()));

La raison est que vous ne pouvez pas utiliser les références de méthode et les expressions lambda ensemble.


0 commentaires

1
votes

Vous pouvez essayer:

foxes.stream().filter(this::isColorGreen).map(Fox::getName).forEach(System.out::println);


public boolean isColorGreen(Fox fox) {
    return fox.getColor().equals("green");
}


0 commentaires