Являются ли потоки Java 8 такими же, как .Net IEnumerable?

Сначала я думал, что потоки Java обязательно связаны с I/O, но они действительно похожи на интерфейс IEnumerable в .NET.

Является ли это сравнение честным?

Ответы

Ответ 1

Может быть, это что-то интересное, что я нашел в Google для вас:

Streams

Потоки Java (не путать с InputStream и OutputStream) делают более или менее то же самое, что и LINQ, с параллельной обработкой зеркалирования PLINQ. Однако не существует какого-либо приятного SQL-подобного синтаксиса - вы должны делать это в функциональном стиле. И так же, как для LINQ требуются методы расширения, потоки не появляются до Java 8, потому что им нужны методы защитника для работы с существующими типами коллекций.

Поток в значительной степени эквивалентен .NET IEnumerable. Чтобы увидеть, насколько они похожи, рассмотрим следующие примеры:

// Write each value in a collection to standard output on a separate line:

// C# - LINQ
myCollection.ForEach( x => Console.WriteLine(x) );
// Java - stream
myCollection.stream().forEach( x -> System.out.println(x) );

// Sum all the values in a (potentially large) collection, using parallelism
// if possible:

// C# - PLINQ
int sum = myCollection.AsParallel().Aggregate( (x, y) => x + y );
// Java - parallel stream
int sum = myCollection.stream().parallel().reduce( (x, y) -> x + y );

Вы ожидаете, что метод stream() будет в Iterable, так же, как LINQ работает с IEnumerable, но вместо этого в Collection. Возможно, это потому, что в Java отсутствует семантика возврата-возврата, поэтому Iterable просто менее интересен или полезен в Java.

источник: http://leftoblique.net/wp/2013/07/25/java-8-aka-oracle-finally-catches-up-to-net-framework-3-0/

РЕДАКТИРОВАТЬ: Есть много, чтобы найти об этом в Google. Вот еще несколько интересных статей: https://web.archive.org/web/20130331002411/http://blog.informatech.cr/2013/03/24/java-streams-preview-vs-net-linq/