Direi apenas que cuidado com findFirst()
E findAny()
ao usar.
A partir de seu Javadoc ( aqui e aqui ), os dois métodos retornam um elemento arbitrário do fluxo - a menos que o fluxo tenha uma ordem de encontro , caso em que findFirst()
retorna o primeiro elemento enquanto findAny()
retornará qualquer elemento.
Suponha que temos o list
ISBN e o nome do LIVRO personalizados. Para um cenário, veja este exemplo:
public class Solution {
private Integer ISBN;
private String BookName;
public Solution(int i, String string) {
ISBN =i;
BookName = string;
}
}
public static void main(String[] args) {
List<Solution> Library = Arrays.asList(new Solution(12,"Java in Action"),new Solution(13,"Java 8"),new Solution(15,"Java 8 Features"),new Solution(16,"Java in Action"));
System.out.println(Library.stream()
.map(p->p.getBookName())
.sorted(Comparator.reverseOrder())
.findFirst());
}
Produto :Optional[Java in Action]
Pode haver situações em que o nome do livro é o mesmo, mas os números ISBN são diferentes; nesse caso, a classificação e a localização do livro podem ser muito semelhantes findAny()
e darão resultados errados. Pense em um cenário onde 5 livros são chamados de "Referência Java", mas têm números ISBN diferentes e o findFirst()
livro por nome resultará no mesmo que findAny()
.
Pense em um cenário onde:
ISBN Name Of book
+-----+------------------+
| 100 | Java-8 in Action |
+-----+------------------+
| 101 | Java-8 in Action |
+-----+------------------+
| 102 | Java-8 in Action |
+-----+------------------+
| 103 | Java-8 in Action |
+-----+------------------+
| 104 | Java-8 in Action |
+-----+------------------+
aqui findFirst () e findAny () fornecerão o mesmo resultado, mesmo se classificados em BookByName.
Artigo detalhado:
filter
aplicado um,findAny
consegue retornar algum elemento, inclusive que não corresponda ao filtro aplicado?