【问题标题】:Java 8 List of list of list of Objects flatmap fetch the inner most listJava 8 List of List of Objects flatmap 获取最里面的列表
【发布时间】:2019-12-01 22:48:01
【问题描述】:

我对 Java 8 不太熟悉(仍在学习中),并希望看看是否可以使用 flatMap 找到与以下代码等效的内容。

我使用 lombok @Builder(你可以忽略那部分)

我们可能需要的一些检查 - 列表可能是空的

我的对象的粗略草图 - 类从头开始{

public static void main(String[] args) {
    List<Object2> object2List = new ArrayList<>();
    object2List.add(Object2.builder().needThisList(Arrays.asList("good" , "bad")).build());
    object2List.add(Object2.builder().needThisList(Arrays.asList("worse" , "awesome")).build());

    List<Object2> object2List_2 = new ArrayList<>();
    object2List_2.add(Object2.builder().needThisList(Arrays.asList("good1" , "bad1")).build());
    object2List_2.add(Object2.builder().needThisList(Arrays.asList("worse1" , "awesome1")).build());

    List<Object1> object1List = new ArrayList<>();
    object1List.add(Object1.builder().object2List(object2List).build());
    object1List.add(Object1.builder().object2List(object2List_2).build());

    //Please get me final list of all the Strings


   }
}

@Builder
class Object1 {
    List<Object2> object2List;
}

@Builder
class Object2 {
    List<String> needThisList;
}

【问题讨论】:

  • 答案就在问题中。使用平面地图。你试过使用它吗?您面临的具体问题是什么?
  • 好吧,我对正确使用它感到困惑:( List finalList = object1List.stream() .flatMap() .map() .collect(Collectors.toList());
  • 我对正确使用它有点困惑。我必须再次在 map 函数中做一个流?
  • List finalList = object1List.stream() .flatMap(Object1::getObject2List) .flatMap(Object2::getNeedThisList) .collect(Collectors.toList());
  • @Cuga - 你是对的。让我编辑一下。

标签: java-8 flatmap


【解决方案1】:

这是没有 Lombock 的情况下它的工作方式。

public class Scratch {
    public static void main(String[] args) {
        List<List<String>> object2List = new ArrayList<>();
        object2List.add(List.of("good", "bad"));
        object2List.add(List.of("worse", "awesome"));

        List<List<String>> object2List_2 = new ArrayList<>();
        object2List_2.add(Arrays.asList("good1", "bad1"));
        object2List_2.add(Arrays.asList("worse1", "awesome1"));

        List<List<List<String>>> object1List = new ArrayList<>();
        object1List.add(object2List);
        object1List.add(object2List_2);

        // Please get me final list of all the Strings

        System.out.println(object1List.stream().flatMap((outer) -> outer.stream()).flatMap((mid) -> mid.stream()).collect(Collectors.toList()));
    }
}

打印:

[good, bad, worse, awesome, good1, bad1, worse1, awesome1]

编辑

重新阅读原始帖子,如果您想保留原始列表(即最终得到 4 个列表的列表),那么您可以这样做:

System.out.println(object1List.stream().flatMap((outer) -> outer.stream()).collect(Collectors.toList()));

会打印出来:

[[good, bad], [worse, awesome], [good1, bad1], [worse1, awesome1]]

【讨论】:

  • List.of 是 Java 9,但如果可用,则没有理由将其与手动列表构造混合,即您可以简单地使用 List&lt;List&lt;String&gt;&gt; object2List = List.of(List.of("good", "bad")), List.of("worse", "awesome")), object2List_2 = List.of(List.of("good1", "bad1"), List.of("worse1", "awesome1")); List&lt;List&lt;List&lt;String&gt;&gt;&gt; object1List = List.of(object2List, object2List_2);
猜你喜欢
  • 1970-01-01
  • 2012-04-07
  • 2020-11-22
  • 2022-12-28
  • 1970-01-01
  • 2014-03-22
  • 1970-01-01
  • 2012-11-29
  • 2019-06-29
相关资源
最近更新 更多