Как разбить массив списков по нескольким спискам по конкретному свойству объекта Java8 в одну строку - PullRequest
0 голосов
/ 05 сентября 2018

Предположим, у меня есть

private String userId;
private String email;
private AWSRegion region;
private String total;
List<Prop> all = new ArrayList<>
all.add(new Prop("aaa", "dddd", "EU", total1));
all.add(new Prop("aaa1", "dddd", "US", tota2l));
all.add(new Prop("aaa2", "dddd", "AU", tota2l));
all.add(new Prop("aaa3", "dddd", "AU", tota3l));
all.add(new Prop("aaa3", "dddd", "EU", tota4l));....a lot of regions

Я хочу в одной строке java8 иметь список списков по свойству "AWSRegion"

некоторые думают как .... но не запускать его как "предикат фильтра", потому что у меня много регионов ...

List<Prop> users = all.stream().filter(u -> u.getRegeion() == AWSRegion.ASIA_SIDNEY).collect(Collectors.toList());

RESULT должен быть список списков:

LIST : {sublist1-AU , sublist2-US, sublist3-EU....,etc'}

спасибо,

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Вы можете создать карту с помощью <AWSRegion, List<Prop>, сгруппировав свой список по регионам:

Map<AWSRegion, List<Prop>> regionMap = all.stream()
   .collect(Collectors.groupingBy(Prop::getRegion, Collectors.toList()));

Если вы хотите это как список, то вы можете просто позвонить:

List<List<Prop>> lists = new ArrayList<>(regionMap.values());
0 голосов
/ 05 сентября 2018

Используйте groupingBy, чтобы получить Map<AWSRegion,List<Prop>>, а затем получите значения этого Map:

Collection<List<Prop>> groups =
    all.stream()
       .collect(Collectors.groupingBy(Prop::getRegion))
       .values(); 

Если выходные данные должны быть List, добавьте дополнительный шаг:

List<List<Prop>> groups = new ArrayList<>(
    all.stream()
       .collect(Collectors.groupingBy(Prop::getRegion))
       .values()); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...