java - 嵌套循环到 Java 流之谜

标签 java java-stream

我是 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/

相关文章:

java - 连接流或 Iterables : StackOverflow

java - 流图以查找最新 key 的值

Java 8 访问嵌套列表中的先前值

java - 如何限制 MongoDB 异步驱动程序中的线程池大小

java - 具有不同树的同一个 jar 的依赖关系

Java 8 Stream 从返回值中添加新对象到列表

java - Java编译器是否优化流过滤?

java - Apache Flink 中的 TimeCharacteristics 和 TimerService

java - Android如何通过不同的activity访问同一个对象

java - 为什么我们说链表插入是常数时间?