Como obter o primeiro elemento que corresponde a um critério em um fluxo? Eu tentei isso mas não funciona
this.stops.stream().filter(Stop s-> s.getStation().getName().equals(name));
Esse critério não está funcionando, o método de filtro é chamado em uma classe diferente de Stop.
public class Train {
private final String name;
private final SortedSet<Stop> stops;
public Train(String name) {
this.name = name;
this.stops = new TreeSet<Stop>();
}
public void addStop(Stop stop) {
this.stops.add(stop);
}
public Stop getFirstStation() {
return this.getStops().first();
}
public Stop getLastStation() {
return this.getStops().last();
}
public SortedSet<Stop> getStops() {
return stops;
}
public SortedSet<Stop> getStopsAfter(String name) {
// return this.stops.subSet(, toElement);
return null;
}
}
import java.util.ArrayList;
import java.util.List;
public class Station {
private final String name;
private final List<Stop> stops;
public Station(String name) {
this.name = name;
this.stops = new ArrayList<Stop>();
}
public String getName() {
return name;
}
}
java
java-8
java-stream
user2147674
fonte
fonte
.findFirst().orElse(yourBackUpGoesHere);
. Isso também pode ser nulo.findFirst().orElse(null);
findFirst()
retorna um objeto opcional ( JavaDoc ), que pode estar vazio. Nesse caso, a chamada paraget()
lançará o NPE. Para evitar que isso aconteça, use emorElse()
vez deget()
e forneça um objeto substituto (comoorElse(new Station("dummy", -1)
) ou armazene o resultado defindFirst()
em uma variável e verifiqueisEmpty()
antes de chamarget()
Quando você escreve uma expressão lambda, a lista de argumentos à esquerda de
->
pode ser uma lista de argumentos entre parênteses (possivelmente vazia) ou um único identificador sem parênteses. Mas, na segunda forma, o identificador não pode ser declarado com um nome de tipo. Portanto:é sintaxe incorreta; mas
está correto. Ou:
também está correto se o compilador tiver informações suficientes para descobrir os tipos.
fonte
s
para usar com o lambda? Realmente não parece um erro para mim, mas aparentemente não estou usando o mesmo compilador que você.findFirst().get()
aplicado depoisfilter
) e não recebo nenhum erro. O terceiro exemplo funciona para mim também.Acho que esta é a melhor maneira:
fonte