【问题标题】:Convert Map<String, NavigableMap<Long, Collection<String>>> to List<String> using Java8使用 Java8 将 Map<String, NavigableMap<Long, Collection<String>>> 转换为 List<String>
【发布时间】:2016-02-28 22:24:59
【问题描述】:

我正在尝试将 Map&lt;String, NavigableMap&lt;Long, Collection&lt;String&gt;&gt;&gt; 转换为 List&lt;String&gt; Java 8。

我写了一些代码,但在中间的某个地方卡住了。

userTopics.values().stream().map(
    new Function<NavigableMap<Long, Collection<String>>, Collection<String>>() {
        @Override
        public Collection<String> apply(NavigableMap<Long, Collection<String>> t) {
            return null;  //TODO
        }
    }
);

【问题讨论】:

    标签: java java-8


    【解决方案1】:

    只要flatMap that s**t:

    List<String> values = nestedMap.entrySet()
            .stream()
            .map(Map.Entry::getValue)
            .flatMap(m -> m.entrySet().stream())
            .map(Map.Entry::getValue)
            .flatMap(Collection::stream)
            .collect(toList());
    

    正如Holger 指出的那样,这更整洁:

    List<String> values = nestedMap.values()
            .stream()
            .flatMap(m -> m.values().stream())
            .flatMap(Collection::stream)
            .collect(toList());
    

    【讨论】:

    • 一个有趣的反模式,甚至两次。 entrySet().stream().map(Map.Entry::getValue) 而不是首先流式传输所需的项目:values().stream()
    • @cody123:与.map(entry -&gt; entry.getValue()) 相同,entry 的类型为Map.Entry。当您还需要中间流操作中的键时,通过entrySet().stream() 流式传输条目并在需要值流时映射到值是正确的解决方案。但是,当您需要 only 值时,您可以首先正确地流过这些值。
    【解决方案2】:

    两个flatMaps 就可以了,将NavigableMap 压平,然后将Collection 压平。

    List<String> result = mapOfMaps.values()
                .stream()
                .flatMap(v -> v.values().stream())
                .flatMap(Collection::stream)
                .collect(Collectors.toList());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-21
      • 1970-01-01
      • 2021-12-21
      • 1970-01-01
      • 2015-11-21
      • 1970-01-01
      • 2020-04-01
      • 1970-01-01
      相关资源
      最近更新 更多