2016-04-17 2 views
3

Я группирую список автомобилей тем, у кого есть имя, а другое - нет.Java stream - взять внутренний элемент после GroupBy

cars.stream().collect(Collectors.groupingBy(car -> IdUtil.isEmpty(car.getName().equals("")))); 

В этом примере я буду получать Map<Boolean, List<Cars>>

Вопросы:

  1. Я хочу, чтобы получить другой внутренний элемент из каждой группы, так что я буду получать Map<Boolean, List<wheels>> используя условие

возвращение ((автомобиль.getName(). Равный (""))? Переднее колесо ? задние колеса;

  1. Могу ли я контролировать значение ключа?
    для этого примера, используя строку, которая говорит
    "Задний" -> Автомобили Список "Фронт" -> Автомобили Список

Спасибо.

+1

Рассмотрите возможность использования 'Collectors.partitioningBy' вместо' groupingBy' с помощью 'boolean'. – Misha

ответ

4

Для # 1, вы можете использовать консервный ЦЕПЬ mappingCollector на карту List<Cars> к чему-то еще:

Map<Boolean,List<wheels>> map1 = 
cars.stream() 
    .collect(Collectors.groupingBy(car -> IdUtil.isEmpty(car.getName().equals("")), 
            Collectors.mapping(car -> ((car.getName().equals(""))? car.getFrontWheel() : car.getRearWheels(),Collectors.toList())); 

Для # 2, не должно быть никаких проблем, чтобы изменить ключ к тому, что вы хотите:

Map<String,List<Cars>> map2 = 
cars.stream() 
    .collect(Collectors.groupingBy(car -> IdUtil.isEmpty(car.getName().equals(""))?"Front":"Rear")); 

Конечно, вы можете совместить эти два и получить Map<String,List<wheels>>.

Примечание: этот код не проверен, поэтому у меня могут быть опечатки.

Смежные вопросы