首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用collect保留Java流中的顺序

使用collect保留Java流中的顺序
EN

Stack Overflow用户
提问于 2018-06-06 01:43:27
回答 1查看 3.1K关注 0票数 4

我遇到了一个小问题,我需要在对字符串列表执行的操作中保留顺序,并使用java streams中的collect方法。

代码语言:javascript
复制
public List<String> countOccurrences(ArrayList<String> messages) {
        List<String> stackedMessages = new LinkedList<>();
        HashMap<String, Integer> messageOccurrences = 
                   messages.stream()
                           .collect(groupingBy(Function.identity(), summingInt(e -> 1)));

        messageOccurrences.forEach((key, value) -> {
            String appendString = value == 1 ? "" : " (" + value + " times)";
            stackedMessages.add(key + appendString);
        });

        return stackedMessages;
    }

上面代码的问题是,如果我处理一个像["blah", "blah", "yep"]这样的列表,它会返回["yep", "blah (2 times)"],而我需要它返回["blah (2 times)", "yep"]

我已经看过这篇文章了,我相信如果我在已经排序的数据结构上使用流,那么顺序就会得到保证:How to ensure order of processing in java8 streams?

我认为我需要将groupingBy更改为toMap,目前我正在阅读该文档。任何已经精通这个主题的人都可以提供一些建议。

更新:

感谢用户@Aominè,这是使用groupingBy的正确方法

代码语言:javascript
复制
.collect(groupingBy(Function.identity(),LinkedHashMap::new, summingInt(e->1)))
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-06 02:05:55

您需要收集到LinkedHashMap才能获得预期的结果。此外,您不必在groupingBy之后从流管道单独执行另一个forEach,只需从entrySetmap创建一个流,然后收集到列表即可。

代码语言:javascript
复制
return messages.stream()
               .collect(groupingBy(Function.identity(), LinkedHashMap::new, summingInt(e -> 1)))
               .entrySet()
               .stream()
               .map(e -> e.getKey()+(e.getValue() == 1 ? "" : " (" + e.getValue() +" times)"))
               .collect(toList());
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50706034

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档