Je viens de commencer à jouer avec les lambdas Java 8 et j'essaie d'implémenter certaines des choses auxquelles je suis habitué dans les langages fonctionnels.
Par exemple, la plupart des langages fonctionnels ont une sorte de fonction de recherche qui opère sur des séquences, ou des listes qui renvoie le premier élément, pour lequel le prédicat est true
. La seule façon que je peux voir pour y parvenir dans Java 8 est:
lst.stream()
.filter(x -> x > 5)
.findFirst()
Cependant, cela me semble inefficace, car le filtre analysera toute la liste, du moins à ma connaissance (ce qui pourrait être faux). Y a-t-il une meilleure façon?
java
java-8
java-stream
siki
la source
la source
Réponses:
Non, le filtre n'analyse pas l'intégralité du flux. Il s'agit d'une opération intermédiaire, qui renvoie un flux paresseux (en fait, toutes les opérations intermédiaires renvoient un flux paresseux). Pour vous convaincre, vous pouvez simplement faire le test suivant:
Quelles sorties:
Vous voyez que seuls les deux premiers éléments du flux sont réellement traités.
Vous pouvez donc suivre votre approche qui est parfaitement bien.
la source
get();
ici parce que je sais quelles valeurs je fournis au pipeline de flux et donc qu'il y aura un résultat. En pratique, vous ne devez pas utiliserget();
, maisorElse()
/orElseGet()
/orElseThrow()
(pour une erreur plus significative au lieu d'un NSEE) car vous ne savez peut-être pas si les opérations appliquées au pipeline de flux aboutiront à un élément..findFirst().orElse(null);
par exempleorElse
?Optional
type, ce qui.findFirst
revient. L'une des utilisations d'Optional est d'aider les développeurs à éviter d'avoir à traiter avecnull
seg au lieu de vérifiermyObject != null
, vous pouvez vérifiermyOptional.isPresent()
ou utiliser d'autres parties de l'interface Optional. Est-ce que c'est plus clair?Non, il ne le fera pas - il "se cassera" dès que le premier élément satisfaisant le prédicat sera trouvé. Vous pouvez en savoir plus sur la paresse dans le package de flux javadoc , en particulier (c'est moi qui souligne):
la source
J'ai dû filtrer un seul objet d'une liste d'objets. J'ai donc utilisé cela, j'espère que cela aide.
la source
.orElse(null) != null
. Utilisez plutôt les API facultatives,.isPresent
c'est-à - dire.findFirst().isPresent()
..stream().map(ParkingLot::getId).anyMatch(Predicate.isEqual(id))
En plus de la réponse d' Alexis C , si vous travaillez avec une liste de tableaux dans laquelle vous ne savez pas si l'élément que vous recherchez existe, utilisez ceci.
Ensuite, vous pouvez simplement vérifier si un est
null
.la source
la source
Réponse One-Liner améliorée: Si vous recherchez une valeur de retour booléenne, nous pouvons le faire mieux en ajoutant isPresent:
la source