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();