Collectors.groupingBy на карте Результат к вложенной карте - PullRequest
0 голосов
/ 27 августа 2018

У меня следующий код

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

Ответы [ 2 ]

0 голосов
/ 27 августа 2018

Вот способ без потоков:

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<>().

0 голосов
/ 27 августа 2018

Вложенный 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)
        ));
...