如何将字符串字段添加到由流形成的字符串列表中

Posted

技术标签:

【中文标题】如何将字符串字段添加到由流形成的字符串列表中【英文标题】:How to add a string field to the List of string formed by stream 【发布时间】:2022-01-22 15:19:53 【问题描述】:

我有一个字符串字段userId,我想将它添加到由user.getFollowing.stream().toList()这样的流形成的字符串列表中

public List<Post> getAllPosts(String userId) 
    User user = this.findUserById(userId);
    System.out.printf("Finding all posts created by %s%n", userId);
    
    if (user != null) 
        List<String> userList = user.getFollowing().stream().toList();

        userList.add(userId).stream().toList();

        List<Post> allPostsList = postService.findPostsCreatedByMultipleUsers(userList);
        System.out.printf("Returning %d posts created by %s%n", allPostsList.size(), userId);
        return allPostsList;
     else 
        System.out.printf("Unable to find user by id %s%n", userId);
        return null;
    

【问题讨论】:

我只想将 userId 字段添加到由流形成的字符串列表中(在此我想添加用户 id ... user.getFollowing().stream.toList())跨度> 请查看***.com/editing-help,并尝试相应地格式化您的问题。 【参考方案1】:

有几种可能的解决方案:

    stream::toList 返回一个不可变列表,所以如果它被一个可变列表替换,userId 可能只是添加:
List<String> userList = user.getFollowing().stream().collect(Collectors.toCollection(ArrayList::new));
userList.add(userId);
// ...
    使用Stream::concat 连接两个流,第二个是使用Stream.ofuserId 创建的:
List<String> userList = Stream.concat(
        user.getFollowing().stream(),
        Stream.of(userId)
    )
    .toList();

然而,最简单的解决方案根本不需要 Stream API:

List<String> userList = new ArrayList<>(user.getFollowing());
userList.add(userId);

【讨论】:

collect(Collectors.toList()) 返回带有no guarantees on the type, mutability, serializability, or thread-safety 的列表,因此不建议将其作为获取可变列表的解决方案。 collect(Collectors.toCollection(ArrayList::new)) 将是保证可变列表的有效解决方案。但是,这是对流进行过度工程的典型案例。 List&lt;String&gt; userList = new ArrayList&lt;&gt;(user.getFollowing()); userList.add(userId); 也能胜任。 不保证,但仍返回ArrayList with ArrayList::newStream::toList 的实现也给我留下了深刻的印象:return (List&lt;T&gt;) Collections.unmodifiableList(new ArrayList&lt;&gt;(Arrays.asList(this.toArray()))); 它确实在参考实现中返回ArrayList,但您不应该依赖实现细节,尤其是当文档明确表示不能保证时。您所指的Stream::toList 实现是您在实践中可能永远不会遇到的默认实现。你最终得到的实际实现要好得多。但是,默认的has been discussed here。

以上是关于如何将字符串字段添加到由流形成的字符串列表中的主要内容,如果未能解决你的问题,请参考以下文章

如何将约束添加到由明确的子句语法生成的列表中?

三:我们如何将本地加载的网格插入到由三生成的画布中以显示它?

mysql 数据库 列表中的字段前如何批量添加指定字符?

您可以将 CSS 添加到由自定义字段创建的 CSS 类的子类中吗?

Python如何将列表中的元素添加到另一个字符串列表中

Firestore - 如何在将文档添加到集合后获取文档 ID