Почему нельзя использовать функцию идентификации 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())
Другие вопросы по тегам