Java 8 字符串列表和字符串列表
Java 8 List from String and List of String
我想从 Bean 列表生成一个字符串列表,包括 ID 和外部 ID。
public class User {
private String id;
private List<String> externalIds;
}
我是用下面的代码得到的,但是这里我需要做两次流。
List<User> references = new ArrayList();
Stream.concat(references.stream().map(User::getId),
references.stream().map(User::getExternalIds).flatMap(Collection::stream))
.collect(Collectors.toList());
有没有更好的方法重写这段代码?
在flatMap
操作中使用Stream.concat
:
references.stream()
.flatMap(user -> Stream.concat(
Stream.of(user.getId()),
user.getExternalIds().stream()
))
.collect(Collectors.toList())
试试这个:
references.stream()
.flatMap(u -> Stream.of(List.of(u.getId()), u.getExternalIds()))
.flatMap(List::stream)
.collect(Collectors.toList());
如果您使用的是 Java 16+,则可以使用 mapMulti
。这实质上拦截了流中的每个项目并将其替换为其他项目。它避免了 re-streaming 和平面映射。由于流的性质(即类型)正在从 User
更改为 String
,因此需要 mapMulti
之前的见证。
- 在流中添加
user id
。
- 然后在该用户的信息流中添加每个
external id
List<String> results = references.stream()
.<String>mapMulti((user, consumer) -> {
consumer.accept(user.getId());
for (String id : user.getExternalIds()) {
consumer.accept(id);
}
}).toList();
我想从 Bean 列表生成一个字符串列表,包括 ID 和外部 ID。
public class User {
private String id;
private List<String> externalIds;
}
我是用下面的代码得到的,但是这里我需要做两次流。
List<User> references = new ArrayList();
Stream.concat(references.stream().map(User::getId),
references.stream().map(User::getExternalIds).flatMap(Collection::stream))
.collect(Collectors.toList());
有没有更好的方法重写这段代码?
在flatMap
操作中使用Stream.concat
:
references.stream()
.flatMap(user -> Stream.concat(
Stream.of(user.getId()),
user.getExternalIds().stream()
))
.collect(Collectors.toList())
试试这个:
references.stream()
.flatMap(u -> Stream.of(List.of(u.getId()), u.getExternalIds()))
.flatMap(List::stream)
.collect(Collectors.toList());
如果您使用的是 Java 16+,则可以使用 mapMulti
。这实质上拦截了流中的每个项目并将其替换为其他项目。它避免了 re-streaming 和平面映射。由于流的性质(即类型)正在从 User
更改为 String
,因此需要 mapMulti
之前的见证。
- 在流中添加
user id
。 - 然后在该用户的信息流中添加每个
external id
List<String> results = references.stream()
.<String>mapMulti((user, consumer) -> {
consumer.accept(user.getId());
for (String id : user.getExternalIds()) {
consumer.accept(id);
}
}).toList();