我是 Java 8 中的流的新手。我正在努力弄清楚如何使用流在列表上实现嵌套 for 循环。一个列表包含消息,消息中的一个字段是作者的 id(遗憾的是不是 obj 引用)。另一个列表是作者,作者中的一个字段是作者id。代码需要在作者列表中为消息列表中的每条消息找到匹配的作者。我拥有的工作 Java 代码(不使用流或 lambda)如下,我的问题是如何使用流重写它?我已经尝试了几件事,我认为需要一个 flatMap 和一个过滤器,但我似乎做对了。
public void showAuthors(List<Message> messages, List<Authors> authors) {
String authorName=null;
for (Message message : messages) {
int authorId = message.getAuthorId();
for (Authors author : authors) {
if (author.getId() == authorId)
authorName = author.getFullName();
break;
}
System.out.println("Message id is " + message.getId() +
" author is " + authorName);
}
}
我在这里看过一些类似的问题,但我似乎无法正确回答。
感谢任何帮助!
=============================================
更新:作者列表的 Id 字段有一些空数据。这要求我使用带有流操作的过滤器来创建 AuthorId、Name 的映射。
最佳答案
由于您正在进行mxn
比较,因此最好在authorId -> author
之间创建一个Map 以避免O(n)
查找作者:
Map<Integer, Author> authorMaps = authors.stream().collect(toMap(Author::getId, Function.identity()));
现在您可以像这样获取每条消息的作者:
messages.stream().filter(m -> authorMaps.containsKey(m.getAuthorId()))
.forEach(m ->
System.out.println("Message id is " + m.getId() +
" author is " + authorMaps.get(m.getAuthorId()). getFullName());
);
关于java - 嵌套循环到 Java 流之谜,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51412749/