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

Nic*_*ick 2 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;
Run Code Online (Sandbox Code Playgroud)

在哪里我尝试订购数据流,我认为该地图也是订购的.但是我错了.我认为调用collect(Collectors.toMap())不保存流的顺序.有没有例子我怎么能这样做?

use*_*er7 8

假设allConfigurations.stream按照你所说的维持秩序......

您可以使用Collectors.toMap带有a 的重载,mapSupplier因此您可以传递一个,LinkedHashMap因为它维护了插入顺序.

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

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