Estou tentando usar o Java 8 Stream
s para encontrar elementos em um LinkedList
. Quero garantir, no entanto, que haja uma e apenas uma correspondência com os critérios de filtro.
Pegue este código:
public static void main(String[] args) {
LinkedList<User> users = new LinkedList<>();
users.add(new User(1, "User1"));
users.add(new User(2, "User2"));
users.add(new User(3, "User3"));
User match = users.stream().filter((user) -> user.getId() == 1).findAny().get();
System.out.println(match.toString());
}
static class User {
@Override
public String toString() {
return id + " - " + username;
}
int id;
String username;
public User() {
}
public User(int id, String username) {
this.id = id;
this.username = username;
}
public void setUsername(String username) {
this.username = username;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public int getId() {
return id;
}
}
Este código encontra um com User
base em seu ID. Mas não há garantias de quantos User
s correspondem ao filtro.
Alterando a linha de filtro para:
User match = users.stream().filter((user) -> user.getId() < 0).findAny().get();
Vai jogar um NoSuchElementException
(bom!)
Eu gostaria que isso gerasse um erro se houver várias correspondências. Existe uma maneira de fazer isso?
Stream::size
?
Stream
s muito mais do que eu fiz antes ...
LinkedHashSet
(assumindo que deseja preservar o pedido de inserção) ou um o tempo HashSet
todo. Se sua coleção é usada apenas para encontrar um único ID de usuário, por que você está coletando todos os outros itens? Se houver um potencial em que você sempre precisará encontrar algum ID de usuário que também precise ser exclusivo, por que usar uma lista e não um conjunto? Você está programando para trás. Use a coleção certa para o trabalho e salvar a si mesmo essa dor de cabeça
count()
é uma operação do terminal, então você não pode fazer isso. O fluxo não pode ser usado depois.