【问题标题】:extract list inside a list as a single list将列表中的列表提取为单个列表
【发布时间】:2017-09-24 19:11:45
【问题描述】:

我有两个 POJO, 下面的示例代码

class A {
    String name;
    Object entries; // this can be a List<String> or a string - hence Object datatype
   //getters and setter here
}

class B {
    int snumber;
    List<A> values;
   //getters and setters here
}

控制器类

class ControllerA {
    public getList(B b) {
        List<String> list = b.getValues().stream.map(e -> e.getEntries()).collect(Collectors.toList()));
    }
}

这会返回一个列表列表:

[[12345, 09876], [567890, 43215]]

但我想要的是一个类似的列表

[12345,09876,567890, 43215]

如何使用 Java 8 流来做到这一点?

我也尝试过flatMap,但这不适用于Object 数据类型的条目。

【问题讨论】:

  • Object entries; // this can be a list or a string - hence Object datatype - 这是一种糟糕的做法。多态听起来是个更好的主意,应该会让你的生活更轻松。
  • 我怎样才能让它变得更好? List&lt;String&gt; entries?
  • @user2340345 这取决于您的上下文。 这可以是一个列表或字符串 -> 如果它是单个字符串,则使其成为单个元素的列表;如果它是一个包含多个字符串的列表,就这样吧。

标签: java list java-8 java-stream collectors


【解决方案1】:

List&lt;String&gt; 视为A 类中的字段entries

正如 cmets 中提到的@Eugene

如果是单个字符串,则将其设为单个元素的List;如果它是一个包含多个字符串的列表,就这样吧。

使用单一类型的集合可以简化流程:

b.getValues()                           // -> List<A>
        .stream()                       // -> Stream<A>
        .map(A::getEntries)             // -> Stream<List<String>>
        .flatMap(Collection::stream)    // -> Stream<String>
        .collect(Collectors.toList());  // -> List<String>

【讨论】:

  • 完美运行,非常感谢! :) 也可以使用 lambda for flatMap - s -&gt; s.stream()
  • @user2340345,方法引用Collection::streams -&gt; s.stream()的快捷方式
【解决方案2】:

你也可以使用它。

b.getValues()                   // -> List<A>
    .stream()                   // -> Stream<A>
    .map(A::getEntries)         // -> Stream<List<String>>
    .flatMap(Collection::stream)// -> Stream<String>
    .toList();

【讨论】:

  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
猜你喜欢
  • 2021-08-12
  • 1970-01-01
  • 2011-04-24
  • 2018-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-29
  • 2017-12-15
相关资源
最近更新 更多