首页 > 解决方案 > 使用 Java 中的流和 lambda 使用 for 循环重写笛卡尔积

问题描述

我正在尝试让自己熟悉流和 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);
    }
  }
}

标签: javalambdafunctional-programmingjava-stream

解决方案


您可以将两个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());

演示!


推荐阅读