Группировка ArrayList По заданным c условиям - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть эти POJO

class LocaleBook
{
  private String bookId;

  private String bookName;

  private Locale locale;
  //setters & getters
}

class Locale
{
  private String country;

  private String language;
  //setters & getters
}

Пример данных для вышеупомянутого:

"alice", "Alice in the wonderland", "GB", "en"
"matrix", "The Matrix", "TH", "en"
"christtree", "The Christmas Tree", "GB", "en"

И этот метод:

List<LocaleBook> localeBooks = repo.getLocalBooks();

Я хочу сгруппировать данные вместе по стране и языку, и я создал этот POJO:

class NewPoJo
{
  private String country;

  private String language;

  private List<KeyValuePair> localeBooks = new HashSet<>();
  //setters & getters
}

class KeyValuePair {

    private String label;

    private String value;
    //setters & getters
}

Ожидаемый результат:

[
   {
      "country":"GB",
      "language":"en",
      "localeBooks":[
         {
            "label":"alice",
            "value":"Alice in the wonderland"
         },
         {
            "label":"christtree",
            "value":"The Christmas Tree"
         }
      ]
   },
   {
      "country":"TH",
      "language":"en",
      "localeBooks":[
         {
            "label":"matrix",
            "value":"The Matrix"
         }
      ]
   }
]

Я пытался Collectors.groupingBy по country и language но кажется, что это создаст что-то вроде следующего, чего я не хочу. Как я могу сделать это до ожидаемого результата, который я хочу?

{
 "GB_en": [
     {
       "label": "alice"
       "value": "Alice in the wonderland" 
     },
     {
       "label": "christtree"
       "value": "The Christmas Tree" 
     }
 ]
}

1 Ответ

1 голос
/ 13 апреля 2020

Вы можете сделать это с помощью toMap сборщика с функцией merge:

list.stream().collect(Collectors.toMap(LocaleBook::getLocale,
                    lb -> new NewPoJo(lb.getLocale().getCountry(), lb.getLocale().getLanguage(),
  new ArrayList<>(Collections.singletonList(new KeyValuePair(lb.getBookId(), lb.getBookName())))),
            (a, b) -> {
                a.getLocaleBooks().addAll(b.getLocaleBooks());
                return a;
            }))
     .values();

, просто вы должны переопределить методы equals и hashCode в классе Locale.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...