Java 8 lambda obtenir et retirer l'élément de la liste

Donné une liste d'éléments, je veux récupérer l'élément avec une propriété donnée et supprimer de la liste. La meilleure solution que j'ai trouvé est:

ProducerDTO p = producersProcedureActive
                .stream()
                .filter(producer -> producer.getPod().equals(pod))
                .findFirst()
                .get();
producersProcedureActive.remove(p);

Est-il possible de combiner les obtenir et de les supprimer en une expression lambda?

  • Cela semble vraiment comme un cas classique de quand il suffit d'utiliser une boucle et itérateur à la place.
  • J'ai gentiment fait d'accord 😉 Nous sommes tellement habitués à la programmation impérative, que de toute autre façon dont les sons trop exotiques. Imaginez si la réalité est à l'inverse: nous sommes très utilisé pour la programmation fonctionnelle, et un nouveau paradigme impératif est ajoutée à Java. Diriez-vous que ce serait le cas classique pour les cours d'eau, les prédicats et les options?
  • Ne l'appelez pas get() ici! Vous n'avez aucune idée de savoir si son vide ou pas. Vous allez lancer une exception si l'élément n'était pas là. Au lieu de cela, utilisez l'une des méthodes sûres comme ifPresent, orElse, orElseGet, ou orElseThrow.
  • Probablement une question de goût. Mais je voudrais aussi proposer de ne pas combiner les deux. Quand je vois certaines de code obtenir une valeur en utilisant le flux j'ai l'habitude de supposer que les opérations dans les flux sont exempts d'effets secondaires. Le mélange dans la suppression de l'élément peut entraîner un code qui peut être missleading pour les lecteurs.
  • Juste pour clarifier: voulez-vous supprimer tous les éléments dans le list pour qui la Predicate est vrai ou seulement sur la première (d', éventuellement, un zéro, un ou plusieurs éléments)?
  • Il n'a rien à voir avec le style de préférence; je suis un fan de lambdas, Java 8 ou Groovy. Mais dans ce cas, l'itération de l'API fournit une exploitation efficace que ne peut pas être utilisé dans un cours d'eau. C'est juste une API verrue.
  • Je suis d'accord avec vous 🙂 Dans ce cas, il est préférable de boucle et l'utilisation d'un itérateur pour supprimer l'élément. Mais vous pouvez également filtrer le flux de la négation du prédicat et de recueillir les résultats d'une nouvelle liste. Les deux sont valables, les deux ont des inconvénients et les avantages. De toute façon, j'utilise un itérateur.
  • Mhaswade Le premier vous a dit: je veux supprimer les éléments correspondant au prédicat mais je sais aussi que la liste contient un seul élément avec un "pod".
  • Eh bien, pas un seul, mais tout au plus une (et donc d'utiliser les Optional). Désolé d'insister pour être précis, mais il est nécessaire, de l'OMI. Dans ce cas, vous devriez prendre juste @chrylis conseils parce que la mutation d'une liste de choses n'est pas fonctionnelle. Ainsi, il est approprié d'utiliser l'existant "supprimer lors de l'itération" Java motif (en veillant à ce que l'Itérateur est favorable à l'élimination) plutôt que d'essayer de l'intégrer dans le Lambda/Flux régime.