如何迭代列表<List<String>>并创建单个列表?

问题描述 投票:0回答:4

我正在开发一个遗留代码,它有一个

List<Student> studentList


每个学生对象包含两个属性
String name;

List<Address> address;

Address
包含两个属性
houseNumber
streetNumber

我想创建一个包含

name, houseNumber, streetNumber
的单个列表。
houseNumber 是一个枚举,所以我将执行
.toString()
if
空值条件。

final List<String> finalList = new ArrayList<>();
studentList
        .forEach(x -> {
                    x.getAddressList()
                            .forEach(y -> {
                                finalList.add(x.getName);
                                finalList.add(y.getHouseNumber != null ?
                                        y.getHouseNumber.toString() : "");
                                finalList.add(y.getStreetNumber);
                            });
                }
        );

我已经编写了这段代码,但我希望它通过使用平面地图来实现结果。任何帮助将不胜感激

java stream flatmap
4个回答
3
投票

为每个学生创建一个名称流和一个包含每个

Adress
´s
houseNumber
streetNumber
的平面映射流,连接此流和平面映射并最终收集:

List<String> finalList = 
    studentList.stream()
           .flatMap(student -> Stream.concat(
                    Stream.of(student.getName()),
                    student.getAddress().stream().flatMap(address ->
                         Stream.of(address.getHouseNumber() != null ? address.getHouseNumber().toString() : "",
                                  address.getStreetNumber()))))
           .collect(Collectors.toList());

0
投票

你想要这个吗:

var rs = lst.stream().flatMap(x -> x.getAddress().stream()
            .map(y -> List.of(x.getName(), 
                y.getHouseNumber() != null ? y.getHouseNumber().toString() : "",
                y.getStreetNumber())
         )).collect(Collectors.toList());

rs
是包含姓名、房屋号码、街道号码的列表。


0
投票

您可以使用 Java Stream API 来执行此操作。我还不明白您到底想要获得什么结果,因此在下面的示例中,我将不同的部分连接成一个字符串。 (有关更多信息,请查看官方 API:https://docs.oracle.com/en/java/javase/12/docs/api/java.base/java/util/stream/Stream.html#flatMap(java .util.function.Function)):

studentList.stream()
            .map(l -> l.getAddressList())
            .flatMap(Collection::stream)
            .map(y -> 
                  y.getName() + " " 
                  + (y.getHouseNumber() != null ? y.getFieldResultStatus().toString() : "") + " " 
                  + y.getStreetNumber());
            })
           .collect(Collectors.toList());

0
投票
List<String> list = students.stream()
        .flatMap(student -> student.getAddress().stream()
                .flatMap(address -> Stream.of(
                        student.getName(),
                        Objects.toString(address.getHouseNumber(), ""),
                        address.getStreetNumber()
                )))
        .toList();

根据要求,这将返回一个扁平列表,重复学生拥有的每个地址的每个学生姓名和门牌号:

students[0].name
students[0].address[0].houseNumber
students[0].address[0].streetNumber
students[0].name
students[0].address[1].houseNumber
students[0].address[1].streetNumber
…
students[n].name
students[n].address[m].houseNumber
students[n].address[m].streetNumber
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.