Ответ 1
метод Iterables.concat удовлетворяет этому требованию:
public static <T> Iterable<T> concat(Iterable<? extends Iterable<? extends T>> inputs)
Есть ли способ flatten
в Гуаве - или простой способ преобразования Iterable<Iterable<T>>
в Iterable<T>
?
У меня есть Multimap<K, V>
[sourceMultimap], и я хочу вернуть все значения, где ключ соответствует некоторому предикату [keyPredicate]. Итак, в данный момент у меня есть:
Iterable<Collection<V>> vals = Maps.filterKeys(sourceMultimap.asMap(), keyPredicate).values();
Collection<V> retColl = ...;
for (Collection<V> vs : vals) retColl.addAll(vs);
return retColl;
Я просмотрел документы Гуавы, но ничего не выскочил. Я просто проверяю, что ничего не пропустил. В противном случае, я извлечу свои три строки в короткий сплющенный общий метод и оставлю это как это.
метод Iterables.concat удовлетворяет этому требованию:
public static <T> Iterable<T> concat(Iterable<? extends Iterable<? extends T>> inputs)
С Java 8 вы можете сделать это без Guava. Это немного неудобно, потому что Iterable напрямую не передает потоки, требуя использования StreamSupport, но не требует создания новой коллекции, такой как код в вопросе.
private static <T> Iterable<T> concat(Iterable<? extends Iterable<T>> foo) {
return () -> StreamSupport.stream(foo.spliterator(), false)
.flatMap(i -> StreamSupport.stream(i.spliterator(), false))
.iterator();
}