gpt4 book ai didi

java - 如何从 Java Streams 中的列表创建 Map 的组合键

转载 作者:行者123 更新时间:2023-12-03 23:26:32 24 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Create a map with composite key with Java 8 on the fly

(1 个回答)


1年前关闭。




我有一个用户对象列表,我想将其转换为一个 Map,键为 FirstName+ Last Name,值为 ID。有什么方法可以使用 Streams 完成此任务吗? .我尝试了以下方法,但由于“表达式的目标类型不是功能接口(interface)”,它没有工作。我应该使用标准 for 循环来实现这一点吗?任何帮助深表感谢。

List<User> users = userRepo.findAll();
Map<String,Long> userIdMap = users.stream()
.collect(Collectors.toMap(User::getFirstName + "|" + User::getLastName, User::getId));

最佳答案

Type::method是方法引用。在 User::getFirstName 的情况下, 这已经是 User -> String 类型了.
Java 中的函数不是一等公民。没有用于组合它们或连接它们的运算符。 +例如,运算符未定义为 User -> String (+) User -> String .它是为 String + String 定义的, 尽管。
因此,您想要的不是编写裸方法引用,而是创建一个整体类型为 User -> String 的表达式。 ,但使用 +实际字符串的运算符。
接受 User 的 lambda需要它作为第一个参数,并且它需要返回一个字符串。 u -> "Hello, World"会是这样一个lambda。根据需要将其放在一起,您最终会得到:Function<User, String> userToFullName = u -> u.getFirstName() + "|" + u.getLastName() ;
然后,您可以在收集器中使用该功能:

Function<User, String> userToFullName = user -> user.getFirstName() + "|"  + user.getLastName();
Map<String,Long> userIdMap =
users.stream()
.collect(Collectors.toMap(userToFullName, User::getId));
或者,如果您不想将 lambda 显式存储在命名变量中:
Map<String,Long> userIdMap = 
users.stream()
.collect(
Collectors.toMap(
user -> user.getFirstName() + "|" + user.getLastName(),
User::getId
));

关于java - 如何从 Java Streams 中的列表创建 Map 的组合键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64209636/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com