Java 8 lambda表达式从自定义类对象列表创建字符串列表

46
我有以下问题:
如何将以下代码片段转换为Java 8的lambda风格?
List<String> tmpAdresses = new ArrayList<String>();
for (User user : users) {
    tmpAdresses.add(user.getAdress());
}

没有头绪,只能从以下开始:
List<String> tmpAdresses = users.stream().map((User user) -> user.getAdress());

7
你已经快完成了。假设你的 map lambda 返回一个 String,只需要在 map(...) 后面添加 .collect(Collectors.toList()) 就可以了。 - Thomas
3
注意:(User user) -> user.getAddress() 可以简写为 user -> user.getAddress()User::getAddress - user85421
5个回答

104

您需要将collect操作应用到您的Stream中,以生成一个List

List<String> adresses = users.stream()
    .map(User::getAdress)
    .collect(Collectors.toList());

了解不同的Collectors的更多信息,请访问documentation

User::getAdress只是另一种写法,等同于(User user) -> user.getAdress(),也可以写成user -> user.getAdress()(因为编译器会推断出类型User)。


9

这是扩展了您的想法:

List<String> tmpAdresses = users.stream().map(user ->user.getAdress())
.collect(Collectors.toList())

7
如果您有更好/替代方案,应添加新答案。解释其优越性。 - Shubhendu Pramanik
这确实对从List<Map>中获取信息很有帮助,谢谢。 - Gaurav Khandelwal

3

另一种使用像上面答案中的lambda收集器的方式

 List<String> tmpAdresses= users
                  .stream()
                  .collect(Collectors.mapping(User::getAddress, Collectors.toList()));

-1
你离成功就差一点了,你只需要将流收集到一个列表中即可。
 List<String> addressList =
  users
    .stream()
    .map(user -> user.getAddress())
    .collect(Collectors.toList())

你的回答与已经发布的五年前的回答有何不同? - undefined
我是新来的,只是想要做出更多的贡献。所以我没有检查之前回答的时间。 - undefined
1
你应该检查一下你的答案是否与其他答案不同,我们不希望一个问题有50个答案,而所有答案都说的是完全相同的事情。如果你想要贡献,我邀请你直接搜索未回答的问题(例如使用java标签)。 - undefined
好的,谢谢 @Lino。 我一定会去寻找未解答的问题,并尝试提供解决方案。 - undefined

-3

您可以使用此方法将 Long 转换为 String

List<String> ids = allListIDs.stream()
                             .map(listid-> String.valueOf(listid))
                             .collect(Collectors.toList());

这并没有试图回答OP的问题。OP明确要求将“User”映射到其“address”。另外,你的问题与已有的问题有何不同? - Lino

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接