Acabei de começar a jogar com o Java 8 lambdas e estou tentando implementar algumas das coisas com as quais estou acostumado nas linguagens funcionais.
Por exemplo, a maioria das linguagens funcionais possui algum tipo de função find que opera em seqüências ou listas que retornam o primeiro elemento, para o qual o predicado é true
. A única maneira de conseguir isso no Java 8 é:
lst.stream()
.filter(x -> x > 5)
.findFirst()
No entanto, isso me parece ineficiente, pois o filtro varrerá a lista inteira, pelo menos para minha compreensão (o que pode estar errado). Existe uma maneira melhor?
java
java-8
java-stream
siki
fonte
fonte
Respostas:
Não, o filtro não varre o fluxo inteiro. É uma operação intermediária, que retorna um fluxo lento (na verdade, todas as operações intermediárias retornam um fluxo lento). Para convencê-lo, você pode simplesmente fazer o seguinte teste:
Quais saídas:
Você vê que apenas os dois primeiros elementos do fluxo são realmente processados.
Então você pode seguir sua abordagem, o que é perfeitamente correto.
fonte
get();
aqui porque sei quais valores alimentam o pipeline de fluxo e, portanto, haverá um resultado. Na prática, você não deve usarget();
, masorElse()
/orElseGet()
/orElseThrow()
(para um erro mais significativo em vez de um NSEE), pois talvez você não saiba se as operações aplicadas ao pipeline de fluxo resultarão em um elemento..findFirst().orElse(null);
por exemploorElse
?Optional
tipo, que é o que.findFirst
retorna. Um dos usos do Opcional é ajudar os desenvolvedores a evitar lidar comnull
seg em vez de verificarmyObject != null
, você pode verificarmyOptional.isPresent()
ou usar outras partes da interface Opcional. Isso tornou mais claro?Não, não vai - ele irá "quebrar" assim que o primeiro elemento que satisfizer o predicado for encontrado. Você pode ler mais sobre preguiça no pacote stream javadoc , em particular (ênfase minha):
fonte
Eu tive que filtrar apenas um objeto de uma lista de objetos. Então eu usei isso, espero que ajude.
fonte
.orElse(null) != null
. Em vez disso, use as APIs opcionais,.isPresent
ie.findFirst().isPresent()
..stream().map(ParkingLot::getId).anyMatch(Predicate.isEqual(id))
Além da resposta de Alexis C , se você estiver trabalhando com uma lista de matrizes, na qual não tem certeza se o elemento que está procurando existe, use-o.
Então você pode simplesmente verificar se um é
null
.fonte
fonte
Resposta aprimorada de uma linha: se você estiver procurando por um valor de retorno booleano, podemos fazer isso melhor adicionando isPresent:
fonte