Прикладная задача на java 8 stream API

220
14 марта 2017, 12:58

Есть три класса: A, B и C. Класс C содержит поле List<B>, класс B содержит поле List<A>. Класс A никакой информации о B и C не имеет. Дан список объектов типа C. Необходимо с помощию stream API по этому списку получить карту, где каждому объекту типа A соответствует список тех объектов типа B, которые его содержат. Например, при такой конфигурации :

C c1 = {b1,b2};
C c2 = {b2};
B b1 = {a1,a2};
B b2 = {a3, a2};
A a1, a2, a3;

получить что-то вроде:

a1 - b1
a2 - b1, b2, b2 // повторяется 2 раза, т.к. b2 встречается и в c1, и в c2
a3 - b2, b2 // аналогично

Всё это должно выглядеть примерно так:

List<C> c_s = Arrays.asList(c1,c2);
Map<...,...> map = c_s.stream()
.map(...)
//...
.collect(...);

Дополнительную информацию в A,B и C вводить нельзя, возможно, стоит добавить какие-то дополнительные классы.

Answer 1

пропущу описание классов A, B, C

    A a1 = new A();
    A a2 = new A();
    A a3 = new A();
    B b1 = new B();
    b1.aList.add(a1);
    b1.aList.add(a2);
    B b2 = new B();
    b2.aList.add(a3);
    b2.aList.add(a2);
    C c1 = new C();
    c1.bList.add(b1);
    c1.bList.add(b2);

    C c2 = new C();
    c2.bList.add(b2);
    Map<A, List<Object>>res = new HashMap<>();
    Arrays.asList(c1, c2).stream()
        .forEach(cElems -> // проходимся по элементам c1 и c2
                     cElems.bList.forEach(bElems -> // элементы класса В
                                  bElems.aList.forEach(
                                  aElems -> { // элементы класса А
                                      if(res.containsKey(aElems)) // если уже есть объект A
                                      {
                                          res.get(aElems).add(bElems); // то добавляем к существующему
                                      }else { // иначе новый создаем
                                          List<Object> bs = new ArrayList<>();
                                          bs.add(bElems);
                                          res.put(aElems, bs);
                                      }
                                  }))
        );
    System.out.println(res.size());
}
READ ALSO
JSTL передача параметра в value из input

JSTL передача параметра в value из input

Доброго времени! Подскажите как передать значение из input в value?

203
Помощь с html плеером

Помощь с html плеером

Здравствуйте, не подскажите как можно сделать одинаковый дизайн (или хотя бы немного похожий) стандартного видео плеера на всех браузерах...

174
Применение фильтра blur к определенной области изображения SVG

Применение фильтра blur к определенной области изображения SVG

У меня есть довольно сложное, динамически созданное svg изображение, которое было реализовано с помощью плагина - jQuery SVGЯ хотел бы создать область...

178
CSS z-index не работает при двух блоках absolute

CSS z-index не работает при двух блоках absolute

Добрый день, у меня есть слайдер

178