【问题标题】:Rewriting a Cartesian product using for loops using streams and lambdas in Java [duplicate]使用Java中的流和lambdas使用for循环重写笛卡尔积[重复]
【发布时间】:2020-11-07 20:19:34
【问题描述】:

我正在尝试熟悉流和 lambda,并且有兴趣了解我们如何根据 lambda 和流编写类似以下内容的内容。虽然这是笛卡尔积,并且可能有更简单的方法来做到这一点,但我更喜欢使用与 map、filter、collect 等流一起引入的“嵌套”操作的答案。

List<String> names = Arrays.asList("Superman", "Batman", "Wonder Woman");
List<String> likes = Arrays.asList("good1", "good2", "good3");
List<String> dislikes = Arrays.asList("bad1", "bad2", "bad3");

List<String> statements = new ArrayList<>();
for (String r : names) {
  for (String s : likes) {
    for (String t : dislikes) {
      statements.add(r + " likes " + s + " and dislikes " + t);
    }
  }
}

【问题讨论】:

  • Concat r + " likes " + s + " and dislikes " + t 每次都非常昂贵,如果您考虑效率,您可以通过这种方式在外循环中预先连接一些像 r + " likes " 的部分

标签: java lambda functional-programming java-stream


【解决方案1】:

您可以将两个 flatMap 操作与嵌套的 map 操作一起使用。

final List<String> statements = names.stream().flatMap(r->
    likes.stream()
        .flatMap(s -> dislikes.stream()
            .map(t -> r + " likes " + s + " and dislikes " + t))
).collect(Collectors.toList());

Demo!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-11
    • 2016-11-22
    • 2012-02-24
    • 2011-09-18
    • 2021-07-17
    • 1970-01-01
    • 2015-12-14
    • 2019-05-23
    相关资源
    最近更新 更多