【问题标题】:How to get the optional values from a map as an optional list?如何从地图中获取可选值作为可选列表?
【发布时间】:2018-08-25 01:40:18
【问题描述】:
Map<Long, Optional<Long>> aMap = new HashMap<>();

这个地图有一些键和可选值。

Optional<List<Long>> valuesList = input.aMap().values().stream()
                            .collect(Collectors.toList());

上述方式有编译错误。如何正确获取可选列表?

【问题讨论】:

  • 收集器返回的列表始终不为空。为什么要用Optional包裹它?
  • 我认为“valuesList”的数据类型应该是 List> 而不是 Optional>。
  • 你需要从地图上得到什么???
  • 普通的 Collection API 在这种情况下更简单:List&lt;Optional&lt;Long&gt;&gt; valuesList = new ArrayList&lt;&gt;(input.aMap().values());
  • @Ganga 我不明白您是否需要通过将Optional&lt;List&lt;Long&gt;&gt; 更改为List&lt;Optional&lt;Long&gt;&gt; 来修复编译错误,或者您是否确实需要从地图中获取Optional&lt;List&lt;Long&gt;&gt;。请澄清。

标签: list dictionary java-8 optional collectors


【解决方案1】:

你错过了返回值,不要忘记 Optional&lt;List&lt;Long&gt;&gt; 是一个可选对象,如果存在则可以有 1 个列表......

你需要一个List&lt;Optional&lt;Long&gt;&gt;

List<Optional<Long>> valuesList = input.aMap()
                   .values()
                   .stream()
                   .collect(Collectors.toList());

【讨论】:

    【解决方案2】:

    您甚至不需要在这里stream,只需将它们收集到List

     List<Optional<Long>> list = new ArrayList<>(input.aMap().values());
    

    【讨论】:

    • 上述方法允许同时获取 List 或 List>,而严格使用 Streams 只允许我获取 List>。不确定这是否有任何区别,或者一般来说,使用流和不用于此类操作之间是否存在区别。
    • @Ganga 上述方法允许同时获取 List 或 List> 而严格使用 Streams 只允许我获取 List> i> 你能澄清一下吗?您的意思是它允许您通过应用 filter? 来获取存在的值?
    • 不,我没有应用任何过滤器,如果您注意到 ΦXocę 웃 Пepeúpa 的回答,那么严格来说只返回 List&lt;Optional&lt;Long&gt;&gt; 而不是 List&lt;Long&gt; 在这种情况下允许。所以我什至可以做到List&lt;Long&gt; list = new ArrayList&lt;&gt;(input.aMap.values());
    • @Ganga 但input.aMap.values() 返回Collection&lt;Optional&lt;Long&gt;&gt; List&lt;Long&gt; list = new ArrayList&lt;&gt;(input.aMap.values()); 应该如何工作?
    猜你喜欢
    • 2015-08-13
    • 1970-01-01
    • 2010-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-28
    • 2017-08-14
    相关资源
    最近更新 更多