Найти элемент по фильтру или получить любой - PullRequest
0 голосов
/ 20 сентября 2019

У меня есть коллекция объектов, где мне нужно найти конкретный объект и, если он не найден, вернуть любой или первый.

Например:

@Getter
@Setter
public class Foo {
    Long id;

    FooType type;
}

, и я хочу сделать что-то подобное:

Foo foo = setOfFoos.stream()
      .filter(f -> f.getType() == TYPE_A)
      // not found my type, return any
      .orElseFirst();

Можете ли вы дать мне какое-нибудь хорошее модное решение из Java 8?Спасибо.

1 Ответ

2 голосов
/ 20 сентября 2019

Вы можете сделать это следующим образом: если у вас есть какие-либо совпадающие, верните первый совпадающий, выберите другой случайный

foo.stream()
   .filter(f -> f.getType() == TYPE_A)
   .findFirst()
   .orElse(foo.get(ThreadLocalRandom.current().nextInt(foo.size())));

Или вы также можете получить первый элемент, если не удовлетворен какой-либо фильтр

foo.stream()
   .filter(f -> f.getType() == TYPE_A)
   .findFirst()
   .orElse(foo.get(0));
...