2016-07-25 8 views
1

У меня есть класс ABC, который содержит два целых поляКрест объединить два списка Java

public class ABC{ 
    private Integer x; 
    private Integer y; 

    // getters and setters 
} 

у меня есть два списка: xValues, Y., которые содержат список целых чисел х и у значений соответственно.

List<Integer> xValues = fetchAllXValues(); //say list xValues contains {1,2,3} 
List<Integer> yValues = fetchAllYValues(); //say list yValues contains {7,8,9} 

Теперь я хочу, чтобы создать объект ABC, используя каждый из значений списка xValues ​​с каждым значений списка, Y.. Я не хочу использовать вложенный цикл. Что было бы более эффективным способом решить эту проблему?

выходные выборки объектов для ABC являются:

 ABC(1,7); 
    ABC(1,8); 
    ABC(1,9); 
    ABC(2,7); 
    ABC(2,8); 
    ABC(2,9); 
    ABC(3,7); 
    ABC(3,8); 
    ABC(3,9); 

ответ

4

Итерация по первому списку и на каждой итерации итерации по второму списку:

xValues.stream() 
    .flatMap(x -> yValues.stream().map(y -> new ABC(x, y))) 
    .collect(toList()); 
+0

Не лямбда-выражение требует констант в своей оценке? Я попробую это один раз и вернусь к вам. –

+1

@AkashRaveendran. Что вы подразумеваете под термином lambda, требуется константа в его оценке? –

+0

как только я использовал выражение лямбда для функции forEach. Но я использовал ошибку, которую я не могу использовать, изменяя значения для поля внутри выражения лямбда. Раньше я просил меня менять поле на статический финал. Вот почему я спросил вас. Не требует ли выражение лямбда констант в его оценке. Однако, когда я пробовал этот код сейчас, такой ошибки не было. –

1

Если вы открыты для использования сторонней библиотеки , вы можете использовать Eclipse Collections, который имеет богатые и сжатые API, доступные непосредственно под коллекциями.

MutableList<Integer> xValues = ListAdapter.adapt(fetchAllXValues()); 
MutableList<Integer> yValues = ListAdapter.adapt(fetchAllYValues()); 

xValues.flatCollect(x -> yValues.collect(y -> new ABC(x, y))); 

flatCollect() здесь эквивалентно Java 8 потоков flatMap(). Аналогично collect() эквивалентен map()

Примечание: Я являюсь коммиттером для коллекций Eclipse.

0

Чтобы решить эту проблему вы можете также использовать некоторую внешнюю LIBS, например, с StreamEx он будет выглядеть следующим образом:

StreamEx.of(xValues).cross(yValues) 
     .map(entry -> new ABC(entry.getKey(), entry.getValue())) 
     .collect(Collectors.toList()); 
Смежные вопросы