Как мне объединить список списков, используя lambdaj? - PullRequest
2 голосов
/ 04 апреля 2011

Я хочу иметь возможность объединять подсписки в один список, используя lambdaj.

У меня есть итерационная версия, которая работает:

// HDU elements are children of each subsystem
Collection<SpaceSystemType> subsystems = this.getAllSubsystems();
Set<SpaceSystemType> sources = new HashSet<SpaceSystemType>();

// Iterate the subsystems, collecting all the sources
for (SpaceSystemType subsystem : subsystems)
    sources.addAll(subsystem.getSpaceSystem()); // getSpaceSystem returns a List<SpaceSystemType>

return sources;

Я бы хотел сделать это:

extract(subsystems, on(SpaceSystemType.class).getSpaceSystem());

Но экстракт возвращает

List<List<SpaceSystemType>> 

поэтому я должен использовать неправильную команду.

Какая команда lambdaj добивается того, чего я хочу?

Ответы [ 2 ]

6 голосов
/ 04 апреля 2011

Я решил эту проблему, используя flatten :

List<SpaceSystemType> sources = flatten(extract(subsystems, on(SpaceSystemType.class).getSpaceSystem()));

SpaceSystemType - это сгенерированный JAXB класс, представляющий поддерево элементов.Поскольку SpaceSystemType.getSpaceSystem () возвращает List, необходимо указать lambdaj, чтобы он взял все листья из дерева.

1 голос
/ 27 июня 2014

Я нашел ответ @retrodone не так легко понять. Вот еще один пример:

List<String> lista1 = Arrays.asList(new String[]{"1", "2", "3"});
List<String> lista2 = Arrays.asList(new String[]{"4", "5", "6"});

Bla bla1 = new Bla(lista1);
Bla bla2 = new Bla(lista2);

List<Bla> blas = Lists.newArrayList(bla1, bla2);

System.out.println(flatten(collect(blas , on(Bla.class).getLista())));
...