Лучший способ использовать поток с классом и подклассом - PullRequest
0 голосов
/ 15 октября 2018

У меня проблема с использованием потоков в Java 8, у меня есть 3 класса, как это:

public Class A {
    String string1A;
    String string2A;
    List<B> listB;
    .
    .
    .
}
public Class B {
    String string1B;
    String string2B;
    .
    .
    .
}
public Class C {
    String string1A;
    String string2A;
    String string1B;
    String string2B;
    .
    .
    .
}

Затем у меня есть метод, который возвращает список C со всеми данными, поступающими избазы данных, и мне нужно создать список A, в котором все данные сгруппированы, значение группировки - String1A.Моя идея заключалась в следующем:

List<A> listA = new ArrayList<A>();

    Set<String> listString1A = listC.stream().map(x->x.getString1A()).distinct().collect(Collectors.toSet());

for(String stringFilter1A: listString1A){
    A a = listC.stream()
               .filter(x->getString1A().equals(stringFilter1A))
               .map(x-> new A(x.getString1A(),x.getString2A))
               .findFirst().get();
    List<B> listB = listC.stream()
                         .filter(x->getString1A().equals(stringFilter1A))
                         .map(x-> new B(...))
                         .collect(Collectors.toList());
    a.setListB(listaB);
    listaA.add(a);
}

Есть ли способ сделать такой запрос, используя только потоки или пытаясь удалить for?

Спасибо.

1 Ответ

0 голосов
/ 15 октября 2018

Вот способ, который группирует c элементы по A, сопоставляя каждый C с новым B:

Map<A, List<B>> map = listC.stream()
    .collect(Collectors.groupingBy(
        c -> new A(...),     // construct new A instance out from c instance
        Collectors.mapping(
            c -> new B(...), // construct new B instance out from c instance
            Collectors.toList())));

Для этого требуется класс A для реализации hashCode иequals последовательно , на основе string1A.

Затем вы просто устанавливаете List<B> для каждого A на карте:

map.forEach((a, listB) -> a.setListB(listB));

А ключи вашей карты - это то, что вы хотите:

Set<A> setA = map.keySet();

Или, если вам действительно нужен список:

List<A> listA = new ArrayList<>(map.keySet());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...