Как отфильтровать списокКоллекция с потоком Java? - PullRequest
0 голосов
/ 05 февраля 2019

У меня есть

List<String, Person> generalList

в качестве списка.есть объект Customer в разделе Person, еще один список в разделе Customer с именем Id

Я хочу отфильтровать этот вложенный IdList в объекте, но он не работает.

Я пытался использовать flatMap, но этот кодне работает

String s = generalList.stream()
.flatMap(a -> a.getCustomer().getIdList().stream())
.filter(b -> b.getValue().equals("1"))
.findFirst()
.orElse(null);

Я ожидаю вывод в виде объекта String или Customer

Редактировать: Мой оригинальный контейнер - это карта, я фильтрую карту в список

Объяснение.

Map<String, List<Person> container;

List<Person> list = container.get("A");

String s = list.stream()
.flatMap(a -> a.getCustomer().getIdList().stream())
.filter(b -> b.getValue().equals("1"))
.findFirst()
.orElse(null);

Вот человек

public class Person
{
private Customer customer;

public Customer getCustomer ()
{
    return customer;
}
}

И клиент

public class Customer {
private Id[] idList;
/*getter setter*/
}

И Id

public class Id {
private String value;
/*getter setter*/
}

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

Возможно, вы ищете операцию map как:

String s = list.stream()
        .flatMap(a -> a.getCustomer().getIdList().stream())
        .filter(b -> b.getValue().equals("1"))
        .findFirst()
        .map(Id::getValue) // map to the value of filtered Id
        .orElse(null);

, которая эквивалентна (просто для пояснения)

String valueToMatch = "1";
String s = list.stream()
        .flatMap(a -> a.getCustomer().getIdList().stream())
        .anyMatch(b -> b.getValue().equals(valueToMatch))
        ? valueToMatch : null;
0 голосов
/ 05 февраля 2019

Обновление 2 Это решение работает непосредственно со списком объектов Person:

String key = "1";
List<Person> list = container.get("A");
String filteredValue = list.stream()
    .flatMap(person -> Arrays.stream(person.getCustomer().getId())
    .filter(id -> id.getValue().equals(key)))
    .findFirst().get().getValue();

Старый ответ, работающий с картой Так как вас интересуют только значения вашей картыВы должны передавать по ним, и в flatMap я не только получил поток в списке getId(), но и отфильтровал их напрямую.Так что, если я правильно понял вашу структуру кода, это должно сработать

String key = "1";

 String filteredValue =  map.values().stream()
     .flatMap(list -> list.stream()
     .flatMap(person -> Arrays.stream(person.getCustomer().getId())
     .filter(id -> id.getValue().equals("1"))))
     .findFirst().get().getValue();

Обновлен для корректировки отредактированного вопроса

...