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



我有一个User对象列表,我想将其转换为Map,键为FirstName+Last Name,值为其ID。有什么方法可以使用Streams实现这一点吗。我试过下面的,但没有用,因为";表达式的目标类型不是函数接口";。我应该使用循环的标准来实现这一点吗?非常感谢您的帮助。

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需要将其作为第一个参数,并且需要返回一个字符串。CCD_ 10将是这样的λ。根据需要将其组合在一起,您最终会得到:

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
));
User::getFirstName + "|" + User::getLastName

在这里,concat方法引用是连接字符串的错误方法。你可以这样使用lambda表达式

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

Polygnome给出了一个很好的答案。但我的看法略有不同。

考虑以下内容:

User u = new User();
Function<User, String> fnc1 = User::getFirstName;

这两者都不允许,因为它们不是字符串,而是方法引用。但是您试图将第一个作为字符串使用,下面的内容无法编译。

String name = User::getFirstName;

要获得名称,您需要执行以下操作,其中u是对所需类的引用。如果你只有一个方法引用,这就是它的解析方式。

name = fnc1.apply(u);

但这并不适用于字符串串联的字符串结构,所以您确实需要这样做λCCD_ 14所允许的CCD_。

只需使用lambda而不是方法引用来调用该方法。

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

我认为最好不要附加firstName和LastName,而是使用不同的方法,如-

Map<Pair<String, String>,Integer> employeePairs = employees.stream().collect(HashMap<Pair<String, String>, Integer>::new,
(m, c) -> m.put(Pair.of(c.getFirstName(), c.getLastName()), c.employeeId),
(m, u) -> {});
employeePairs.get(Pair.of("firstname", "lastname")); // Access the map in this way

这在大数据的情况下节省了大量的字符串连接。

为此,您需要添加一个maven包,为您提供配对功能

<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.11</version>
</dependency>

进口声明将是-

import org.apache.commons.lang3.tuple.Pair;

最新更新