Почему нельзя использовать функцию идентификации Guava вместо функции, которая преобразует список в итеративный?
По унаследованным причинам я должен заново реализовать часть своего кода на Java 8, используя Java 7 и Guava. Исходный код выглядит так:
someMethodReturningSetofListofStrings().stream()
.forEach((List<String> ts) -> ts.stream()
.forEach(...);
С Гуавой я иду с классом FluentIterable, и вот моя попытка:
Function<List<String>, Iterable<String>> f = new Function<List<String>, Iterable<String>>() {
public Iterable<String> apply(List<String> list) { return list; }
}
FluentIterable.from(someMethodReturningSetofListofStrings()).transformAndConcat(f);
Я думал, что определение функции f
было бы ненужным, потому что это функция идентификации, и я мог бы просто использовать функции # identity ().
Но моя IDE (Intellij IDEA 14) жалуется, что transformAndConcat(List<String>, Iterable<?>) cannot be applied to Function<Object, Object>
, Я не понимаю почему, так как List
очевидно, Iterable
,
2 ответа
Решение
Это ошибка вывода типа, в этом случае вы всегда можете явно указать типы
transformAndConcat(Function.<List<String>>identity());
В java8 улучшен вывод типов, и следующий код компилируется в java8
transformAndConcat(Function.identity());
Использование Iterables.concat
:
Iterables.concat(someMethodReturningSetofListofStrings())