Java 8迭代列表中的列表和stream.map()

时间:2017-08-23 21:08:31

标签: java java-8 java-stream

我想知道这个问题是否有单行选项。

我有像豆一样的

public class DataA {
    private String name;
    private String email;
    private List<String> accountNumberName;
}

DataA中的示例值为

name="user1",email="user@a.b.com",accountNumberName=["100", "101", "102"]等。

我有一个帐号和地址Map<String, String> accountNumberNameMap的地图 accountNumberNameMap中的示例数据类似于

{"100"="Account A", "101" = "Account B", "102" = "Account C"}

我想将DataA转换为name="user1",email="user@a.b.com",accountNumberName=["100 - Account A", "101 - Account B", "102 - Account C"]

我有一个DataA集合List<DataA>希望将“列表”中的所有accountNumberName转换为使用account number - Account name accountNumberNameMap

我可以通过使用几个循环然后将帐号转换为帐号 - 帐号名称来实现。想知道Java8流中是否有一种简单的方法可以做到这一点。

1 个答案:

答案 0 :(得分:2)

如果您不介意直接修改列表中的实例,可以将forEachreplaceAll结合使用(我假设我可以访问accountNumberName以简化您的操作也可以通过设定者轻松改变它。

list.forEach(d -> d.accountNumberName.replaceAll(acc -> acc + " - " + accountNumberNameMap.getOrDefault(acc, "")));

如果您不想修改现有实例,可以这样做(假设存在复制构造函数):

list.replaceAll(d -> new DataA(d.name, d.email, d.accountNumberName.stream().map(name -> name + " - " + accountNumberNameMap.getOrDefault(name, "")).collect(toList())));

(如果您不想修改原始列表,只需通过它汇总/收集而不是使用replaceAll