如何将字符串字段添加到由流形成的字符串列表中
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.of
从userId
创建的:
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<String> userList = new ArrayList<>(user.getFollowing()); userList.add(userId);
也能胜任。
不保证,但仍返回ArrayList with ArrayList::new
。 Stream::toList
的实现也给我留下了深刻的印象:return (List<T>) Collections.unmodifiableList(new ArrayList<>(Arrays.asList(this.toArray())));
它确实在参考实现中返回ArrayList
,但您不应该依赖实现细节,尤其是当文档明确表示不能保证时。您所指的Stream::toList
实现是您在实践中可能永远不会遇到的默认实现。你最终得到的实际实现要好得多。但是,默认的has been discussed here。以上是关于如何将字符串字段添加到由流形成的字符串列表中的主要内容,如果未能解决你的问题,请参考以下文章
三:我们如何将本地加载的网格插入到由三生成的画布中以显示它?