如何在地图中保存流的顺序

时间:2018-07-18 14:47:53

标签: java java-stream

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

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())不会保存流的顺序。有例子我该怎么做吗?

1 个答案:

答案 0 :(得分:8)

假设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);

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