Java 8 условная логика внутри Peek? - PullRequest
1 голос
/ 24 октября 2019

В настоящее время у меня есть некоторый код Java 8, который выглядит следующим образом - я уверен, что мог бы объединить это в один вызов, но не уверен, как получить мой условный вызов на месте внутри Looped map. Возможно ли это сделать с помощью peek ()? Или другой вызов Java 8?

Текущий код

//turn above groups into a map, grouped by Resolution
Map<Long,List<LeadChannel>> mappedUp = groups
                .stream()
                .collect( Collectors.groupingBy( channel->channel.getResolution().getId() ) );

Следующий бит преобразуется в карту строки вручную на основе идентификатора ключа.

Map<String, List<LeadChannel>> finalMap = new HashMap<String, List<LeadChannel>>();

for ( Map.Entry<Long,List<LeadChannel>> entry : mappedUp.entrySet()) {
    if(  !entry.getKey().equals( RESOLVED_STATUS ) ) {
        finalMap.put( "unresolved", entry.getValue() );
    } else {
        finalMap.put( "resolved", entry.getValue() );
    }
}

Я пытаюсь что-то сделатькак:

 Map<String,List<LeadChannel>> mappedUp = groups
                        .stream()
                        .collect( Collectors.groupingBy( channel->channel.getResolution().getId() ) )
.entrySet()
.stream()
.peek( if statement etc.. )

1 Ответ

1 голос
/ 24 октября 2019

То, что вы, похоже, ищете, это условное groupingBy как:

Map<String, List<LeadChannel>> finalMap = groups
        .stream()
        .collect(Collectors.groupingBy(channel ->
                channel.getResolution().getId().equals(RESOLVED_STATUS) ?
                        "unresolved" : "resolved"));

Или в нескольких конвейерах, чтобы понять, как вы можете разделить данные, а затем отобразить их далее на основе общего условияв вопросе:

Map<Boolean, List<LeadChannel>> mappedUp = groups
        .stream()
        .collect(Collectors.partitioningBy(channel -> 
                channel.getResolution().getId().equals(RESOLVED_STATUS)));

Map<String, List<LeadChannel>> finalMap = mappedUp.entrySet().stream()
        // in a similar manner you can map your current map's entries as well
        .map(e -> new AbstractMap.SimpleEntry<>(e.getKey() ? "resolved" : "unresolved", e.getValue())) 
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

или, как предположил Хольгер, лучше с использованием лямбды напрямую собрать как

Map<String, List<LeadChannel>> finalMap = mappedUp.entrySet().stream()
        .collect(Collectors.toMap(e -> e.getKey()? "resolved": "unresolved", Map.Entry::getValue)) 
...