我有以下代码
Map<Long,String> timeMap= new HashMap<>();
Map<Boolean, List<Map.Entry<Long,String>>> output= timeMap.entrySet().parallelStream()
.filter(map -> map.getKey()-Instant.now().toEpochMilli()>120000)
.collect(Collectors.groupingBy(o -> o.getKey()<600000));
我希望我的输出是地图嵌套地图
Map<Boolean, List<Map.Entry<Long,String>>> output --> Map<Boolean, Map<Long,String>> output
有人可以帮我写一个BiFunction
吗?
当前,我正在使用以下方法来生成输出。
Map<Long, String> trueMap = output.get(true).stream()
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
Map<Long, String> falseMap = output.get(false).stream()
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
Map<Boolean,Map<Long,String>> booleanMapMap = new HashMap<>();
booleanMapMap.put(true,trueMap);
booleanMapMap.put(false,falseMap);
答案 0 :(得分:4)
嵌套Collector
是更好的方法:
Map<Boolean, Map<Long, String>> collect = timeMap.entrySet().stream()
.filter(e -> e.getKey() - Instant.now().toEpochMilli() > 120_000)
.collect(
Collectors.partitioningBy(e -> e.getKey() < 600_000,
Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)
));
答案 1 :(得分:1)
这是一种没有流的方法:
Map<Boolean, Map<Long, String>> booleanMapMap = new HashMap<>();
timeMap.forEach((k, v) -> {
if (k - Instant.now().toEpochMilli() > 120_000)
booleanMapMap.computeIfAbsent(k < 600_000, dummy -> new HashMap<>()).put(k, v);
});
为了避免NPE,您应该按如下方式从外部地图检索:
Map<Long, String> trueMap = booleanMapMap.getOrDefault(true, new HashMap<>());
如果要按插入顺序保留条目,只需将dummy -> new HashMap<>()
更改为dummy -> new LinkedHashMap<>()
。