【问题标题】:How to save order of the stream in map如何在地图中保存流的顺序
【发布时间】:2018-07-18 14:47:52
【问题描述】:

我尝试从流中获取订单图。我有下一个代码:

Map<String, PatternWrapper> regexps = allConfigurations
    .stream()
    .flatMap(configuration -> configuration.getPlugins().stream())
    .sorted(
            (left, right) -> {
                if (left.getType().equals(ObfuscationType.REGEX_BLACKLIST) &&
                        right.getType().equals(ObfuscationType.REGEX_BLACKLIST))
                    return 0;
                else if (left.getType().equals(ObfuscationType.REGEX_BLACKLIST) &&
                        (!right.getType().equals(ObfuscationType.REGEX_BLACKLIST)))
                    return 1;
                else
                    return -1;
            }
    )
//    .sorted(LogConfiguration.Plugin::compareTo)
    .filter(plugin -> (ObfuscationType.REGEX.equals(plugin.getType())
            || ObfuscationType.REGEX_BLACKLIST.equals(plugin.getType())))
    .collect(Collectors.toMap(
            plugin -> plugin.getId(),
            plugin -> new
                    PatternWrapper(plugin.getId(), Pattern.
                    compile(plugin.getValue()))));

return regexps;

我尝试订购数据流的地方,我认为该地图也已订购。但是我错了。我认为调用 collect(Collectors.toMap()) 不会保存流的顺序。有没有我可以做到这一点的例子?

【问题讨论】:

  • 您可以将Map 更改为具有排序功能的TreeMap。您可以根据您的键定义自己的顺序(或使用String 的自然顺序)。
  • @tobias_k 排序并不意味着有序
  • @Nick 你明白为什么哈希图没有排序吗? (这是Collectors.toMap() 中使用的默认映射)
  • 附带说明,您可以通过使用.sorted(Comparator.comparing(element -&gt; element.getType().equals(ObfuscationType.REGEX_BLACKLIST)));来显着简化您的代码

标签: java java-stream


【解决方案1】:

假设allConfigurations.stream 保持秩序如你所说...

您可以使用Collectors.toMap 的重载,它采用mapSupplier,因此您可以传递LinkedHashMap,因为这样可以保持插入顺序。

Collectors.toMap(
        plugin -> plugin.getId(),
        plugin -> new
                PatternWrapper(plugin.getId(), Pattern.
                compile(plugin.getValue())),
        (left, right) -> left,
        LinkedHashMap::new);

这里的第三个参数是一个合并函数,用于解决同一个键关联的值之间的冲突。但这不应该成为问题,因为您的原始代码中没有。

【讨论】:

  • @Nick 然后您应该通过单击答案左侧的复选标记来接受答案,以向其他人表明您的问题已得到您满意的回答,并将代表授予 user7 提供答案.
  • 是的,我在工作中尝试这样做,但提醒我应该等待 3 分钟。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-26
  • 2016-05-13
  • 1970-01-01
  • 2011-08-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多