Сглаживание коллекции внутри коллекции, чтобы получить единый список <> - PullRequest
0 голосов
/ 28 октября 2018

Я довольно новичок в использовании Java и пытался сгладить коллекции внутри коллекций, используя map, чтобы попытаться получить единый список.Однако я не могу заставить это работать.Чтобы воспроизвести это, я создал довольно простой пример того, что я пытаюсь сделать.Вот что у меня есть:

ClassA

import java.util.List;

public class ClassA {
    private List<ClassB> listOfClassB;

    public ClassA(List<ClassB> listOfClassB) {
        this.listOfClassB = listOfClassB;
    }

    public List<ClassB> getListOfClassB() {
        return this.listOfClassB;
    }
}

ClassB

    public class ClassB {
    private String item;

    public ClassB(String item) {
        this.item = item;
    }

    public String getItem() {
        return item;
    }
}

Main

public class Main {
    public static void main(String[] args) {
        ClassB firstClass = new ClassB("A");
        ClassB secondClass = new ClassB("B");
        ClassB thirdClass = new ClassB("C");
        ClassB fourthClass = new ClassB("D");
        ArrayList<ClassB> firstClassList = new ArrayList<>();
        ArrayList<ClassB> secondClassList = new ArrayList<>();

        firstClassList.add(firstClass);
        firstClassList.add(secondClass);
        secondClassList.add(thirdClass);
        secondClassList.add(fourthClass);

        ArrayList<ClassA> classes = new ArrayList<>();
        classes.add(new ClassA(firstClassList));
        classes.add(new ClassA(secondClassList));

        List<List<String>> collect = classes.stream().map(c -> c.getListOfClassB().stream().map(ClassB::getItem).collect(Collectors.toList())).collect(Collectors.toList());
    }
}

Как вы можете видеть внизу, я могу получить List<List<String>>, но я хочу получить List<String> предметов в ClassB.Я пытался использовать для этого плоскую карту, но не смог заставить ее работать, и искал какое-то руководство.

Заранее спасибо.

Ответы [ 2 ]

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

Это вернет список строк из ClassB:

List<String> listB = classes.stream().flatMap(a-> a.getListOfClassB().stream())
                            .map(ClassB::getItem)
                            .collect(Collectors.toList());

Здесь мы используем flatMap, а затем сопоставим getItem из ClassB инаконец, используйте .collect(...), чтобы вернуть список.

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

Вот пример плоской карты, которая прекрасно работает:

classes.stream().flatMap(aclass -> aclass.getListOfClassB().stream())
    .forEach(b -> System.out.println("Class B Item Name : "+b.getItem()));

Это дает следующий вывод:

Class B Item Name : A
Class B Item Name : B
Class B Item Name : C
Class B Item Name : D

и для получения точного ответа:

List<String> collect2 = classes.stream().flatMap(aclass -> aclass.getListOfClassB().stream())
    .map(b -> b.getItem())
    .collect(Collectors.toList());

это дает мне список следующим образом:

collect2 : [A, B, C, D]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...