Я использую неизменные коллекции Guava (скомпилированные для Java 6) и Java 8 JRE, могу ли я использовать новый интерфейс потока?

Я использую Guava и, в частности, их неизменные коллекции (ImmutableList, ImmutableSet).

Но Guava скомпилирован для Java 6. Если я использую Java 8, могу ли я использовать .stream() с ними?

Ответ 1

Да, вы можете.

Метод .stream(), который определен в интерфейсе Collection, имеет реализацию по умолчанию. И в этом случае .parallelStream() и .spliterator(). И оба List и Set "равны" Collection s.

И это не заканчивается, так как вы также можете использовать Map .forEach() в Guava ImmutableMap. Map имеет другие операции по умолчанию, но они мутируют карту, а постоянные коллекции/карты Guava... Ну...

Обратите внимание, что в общем случае каждый раз, когда метод интерфейса имеет реализацию по умолчанию, он будет указан в javadoc, так как для типа возвращаемого метода будет предшествовать ключевое слово default.

Некоторые примеры, очень грубый код, который работает и использует это (наряду с концепцией Единого абстрактного метода, используемого в lambdas, см. здесь для получения более подробной информации):

ImmutableSet.of(23, 2389, 19).stream().forEach(System.out::println);

(System.outявляется PrintStream, а его .println() method подпись такая же, как и Consumer)

Ответ 2

В связи с тем, что ImmutableList реализует Collection и Iterable, которые являются интерфейсами, предоставляемыми Java 8, имеющими стандартные реализации для методов, которые вы указали, ответ, который вы дали, не является неожиданностью,

Возможно, вопрос следует переформулировать следующим образом: ImmutableList реализовать Collection и Iterable? Потому что, если это так, все методы по умолчанию, предоставляемые Java 8, можно использовать. В частности: .stream(), .parallelStream() и .spliterator().

Но тогда для ответа потребуется только поиск в JavaDoc, предоставляемый Guava, что тоже не имеет большого значения.