Список фильтров Java 8, основанный на условии из части списка - PullRequest
2 голосов
/ 30 мая 2019

У меня есть список объектов N, где N равно

N
|--- type (1,2,3)
|--- A (applicable if type 1)
|--- B (applicable if type 2)
|--- C (applicable if type 3)
|--- List<Integer> p 

Теперь желаемый результат - это фильтрованная версия List, такая что:

create a list List<Integer> l

Сделайте это первым:

if(type == 1) && (A > some_value):
  Add all elements of p to l
  select this N

Позже, когда образуется L:

if(type != 1)
  if(l contains any element from p):
    select this N

Как этого добиться, используя потоки за один шаг?

Я могу сначала отфильтровать и создать список «l», а затем использовать этот список для фильтрации.

l = stream.filter(a -> a.type == 1 && a.A > some_value).collect(..)

Затем используйте l для дальнейшей фильтрации.

Но есть ли лучший и точный способ?

1 Ответ

2 голосов
/ 30 мая 2019
if(type == 1) && (A > some_value):
  Add all elements of p to l
  select this N

Не знаю, что здесь означает "выбрать это N", так как вы выбираете значения p, поэтому я игнорирую эту строку.

Set<Integer> set = listOfN.stream()
    .filter(n -> n.type == 1 && n.A > some_value)
    .flatMap(n -> n.p.stream())
    .collect(Collectors.toSet());

Для лучшей производительности следующего шага (contains()) результат был изменен с List на Set.

if(type != 1)
  if(l contains any element from p):
    select this N
List<N> result = listOfN.stream()
    .filter(n -> n.type != 1 && n.p.stream().anyMatch(set::contains))
    .collect(Collectors.toList());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...