我尝试从流中获取订单图。我有下一个代码:
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())不会保存流的顺序。有例子我该怎么做吗?
答案 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);
此处的第三个参数是合并函数,用于解决与同一键关联的值之间的冲突。但这在这里不应该成为问题,因为您的原始代码中没有一个。