如何使用内部列表流式传输列表

时间:2016-07-14 09:20:22

标签: java java-8 java-stream

我需要一些Java 8流的帮助。 我有一个名称列表,内部整数编号列表,如下代码和示例:

public class Test {

    private String name;    
    private List<Integer> nrList;    

    public Test() {
    }

    public Test(String name, List<Integer> nrList) {

        this.name = name;
        this.nrList = nrList;        
    }

    public String getName() {
        return name;
    }

    public List<Integer> getNrList() {
        return nrList;
    }
}

例如,我想要这个:

1. Alex 10 15
2. Steve 5
3. Bob 3 16 20

流入一个冗余的名称列表,如下所示:

1. Alex 10
2. Alex 15
3. Steve 5
4. Bob 3
5. Bob 16
6. Bob 20

如何使用Java 8流处理此问题?

2 个答案:

答案 0 :(得分:1)

您可以使用flatMap为内部列表的每个元素生成唯一元素。

例如,如果您希望输出为List<String>,其中每个String是一个名称和一个相应整数的串联:

List<Test> input = ...
List<String> output = input.stream()
                           .flatMap(t->t.getNrList().stream().map(i->t.getName() + " " + i))
                           .collect(Collectors.toList());

当然,您可以生成任何元素类型的List作为输出(例如,List<Test>输出,其中每个Test实例的内部列表只有一个元素),具体取决于根据您的要求。您只需更改传递给map的映射函数即可生成所需的实例。

答案 1 :(得分:1)

如果我理解正确,你想要做的是:

    List<Test> lt = new ArrayList<>();
    lt.add(new Test("1", Arrays.asList(1, 2, 3)));
    lt.add(new Test("2", Arrays.asList(2, 3, 4)));

    List<Test> lt2 =
            lt.stream()
                    .map(test ->
                            test.getNrList().stream()
                                    .map(number -> new Test(test.getName(), Arrays.asList(number)))
                                    .collect(Collectors.toList()))
                    .flatMap(l -> l.stream())
                    .collect(Collectors.toList());