当前位置: 首页 > 知识库问答 >
问题:

没有(不必要的)嵌套循环的处理两个相关列表

漆雕和昶
2023-03-14
Book book = ... 
Optional<Author> authorO = authors.stream
                               .filter(author -> author.getId().equals(book.getAuthorId()))
                               .findFirst();

所以我想要这样的东西。你能告诉我怎么做吗?谢谢你。

List<Book> books = ...
List<Author> authors = ...

books
    .stream()
    .??? // stream of pairs? 
    .forEach((book, author) -> {
        processingOne(book, author);

        if (featureFlag2) {
            processingTwo(book, author);
        }

        ...
    });

共有1个答案

姜运珧
2023-03-14

在开始处理图书列表之前,我建议您创建一个以authorid为键和author为值的映射:

Map<Integer, Author> authorMap = authors.stream()
                                        .collect(Collectors.toMap(Author::getAuthorId,
                                                                  Function.identity()));
                               

然后对图书列表进行流式处理,并将其处理为:

books.stream()   
     .forEach(book -> {
         Author author = authorMap.get(book.getAuthorId());
         processingOne(book, author);

         if (featureFlag2) {
             processingTwo(book, author);
         }

         //...
     });

编辑:做同样事情的不同方式。这种方法利用了有状态lambda。

public Consumer<Book> processor(List<Author> authors, boolean featureFlag2) {
    // use concurrent map if you use parallelStream
    // authorMap is the state. It is created only once for the stream.
    Map<Integer, Author> authorMap 
        = authors.stream()
                 .collect(Collectors.toMap(Author::getAuthorId,
                                           Function.identity()));
    return book -> {
        Author author = authorMap.get(book.getAuthorId());
        processingOne(book, author);
        if (featureFlag2) {
            processingTwo(book, author);
        }
    };
}
books.stream()
     .forEach(processor(authors, featureFlag2));
 类似资料:
  • 问题内容: 我了解简单列表理解的工作原理,例如: 而且我也了解嵌套列表的综合工作原理: 所以,当我尝试这样做 我期望这样: 但是我得到了: 所以我有更好的方法解决问题,这给了我我想要的 但是我不明白在第一个代码中返回9个元素 问题答案: 它有9个数字的原因是因为python对待 类似于 即,它是一个嵌套循环

  • 问题内容: 我已经使用Java已有一段时间了,但是我对循环的教育还是有点不足。我知道如何创建存在于Java中的每个循环以及如何打破循环。但是,最近我想到了: 假设我有两个嵌套循环。我可以只使用一条语句来打破两个循环吗? 这是我到目前为止所拥有的。 有没有办法做到这一点? 问题答案: 在Java中,您可以使用标签来指定要中断/继续的循环:

  • 我想在Python2.7中并行化两个嵌套的for循环,但我自己没有成功。我不知道如何接近什么是并行化的定义。 总之,这里是单处理器代码:

  • 这个问题是为了修改过去的试卷,如果我走上了正确的道路,我需要一些建议。 求出下面一段代码的时间复杂度,表示给定整数n的操作次数: 所以我认为外循环是,第一个内环是,第二个内环是。我只是想知道我是否有一个大致的想法,以及如何从这里继续前进。

  • 我有一个这样的数组 我想做的是前面的模型,为其数量绘制徽标,因此三星=3,索尼=7,以此类推,将绘制3个索尼徽标和7个三星徽标。 我想出了这样的办法 但是当然,所有这些都是为了每个数组条目,呼应出名称,所以我最终打印了5个三星,打印了5个索尼,等等。 如何使其使用 qty 数组的值而不是条目数?

  • 问题内容: 另一个Big O符号问题…以下代码的Big O是什么: 我的想法:所以分解一下,我认为外部循环是,那么每个内部循环是什么,这将导致 问题1是否正确? 问题2:在组合嵌套循环时,它总是和每个循环的Big O一样简单吗? 问题答案: 当循环计数器不相互依赖时,总是可以从内部向外进行工作。 最里面的循环始终花费时间O(n),因为无论j和i的值是多少,它都会循环n次。 当第二个循环运行时,它将