Простым (но не самым эффективным) решением было бы использование потоков Java:
Set<Foo> set = Arrays.stream(array)
.flatMap(Arrays::stream)
.collect(Collectors.toSet());
Приведенный выше фрагмент кода сначала создает Stream<Foo[]>
с оператором Arrays.stream(array)
.
Затем он сглаживает этот поток в Stream<Foo>
со вторым оператором: .flatMap(Arrays::stream)
, который ведет себя так же, как .flatMap(arr -> Arrays.stream(arr))
.
Наконец, он создает Set<Foo>
из сплющенного потока с .collect(Collectors.toSet())
.
Я предлагаю более подробно изучить Java Streaming API, представленный в Java 8. Он может сделать гораздо больше, чем просто отобразить 2d-массив в Set.
Другой подход заключается в использовании двух вложенных циклов:
Set<Foo> set = new HashSet<>(); // or LinkedHashSet if you need a similar order than the array
for(Foo[] inner : array) {
for(Foo item : inner) {
set.add(item);
}
}