Is stream better than an iterative approach (e.g. For loop)?
In today’s data rich and integrated world, we are often dealing with streams especially if you are a java programmer. However, how many of us(java programmers) know the internal workings of streams or have a point of view on whether- is stream better than a simple For loop ?
If you know these things, then I believe this blog may not be relevant for you. If not, then let’s dig deeper.
Since I asked you this question so let us start with the internal working of ‘For each’ loop.
for(int x:list)
This is a sugar-coated line that wrapped up the internal iteration code.
This is what is happening when we are calling a For loop. The logic behind this is that the iterator is created over your application code and for every iteration, it will go to collection and collect whatever it requires and comes back to the application code.
It is not possible to process elements of the collection in a parallel way if we are using a For loop. With a For loop, it is not easy to implement something which will do more than one operation on it. E.g., if you want to change the element of a list to upper case, filter something out of it, and then store it in a list, then it’s challenging.
All these difficulties are there because iteration is done on code, not on collection. Here stream comes with simple logic that iteration will be done over-collection internally, not on application code. In technical terms, this is internal iteration and the one with for loop is an external iteration on application code. This logic will mitigate both issues mentioned above. since the stream is doing iteration internally on the collection, it can quickly be processed parallelly as there is no dependency of one element over another and with streams, we can do more than one operation quite easily.
For the same example, which was difficult by a single For loop, we can call streams and convert it to uppercase and filter it as required.
Its much more readable as compared to its For loop implementation.
With all these points, you might think that we should remove For loop from java and use streams everywhere. However, that is not the case. Streams have their disadvantages as well.
Performance ->of course, performance-wise, a simple For loop is better than a stream as streams have quite a bit of overhead.
Readability -> we are familiar with a simple For loop for long, and streams are not that old when we compare it with For loop. That’s one of the reasons we believe simple For loop is more readable, and to some extent, it is correct. For example, when we are using 2 For loops, one inside another, it is readable. Nevertheless, when we have to do the same thing in streams, you will feel it’s complex. So I believe it all comes down to how much familiar we are with streams.
Debugging -> simple For loops is more accessible to debug than streams as legacy debuggers are not equipped with the streams.
As a conclusion, I feel that both streams or For loop are good in their own ways and we developers need to think about which one to use according to our requirements. We need to be equipped with the associated trade-offs and decide when to use streams and when to go for a For loop.
Русские Блоги
Поздравляю, я собираюсь закончить целую серию Java 8 Stream. На самом деле я считаю, что Stream — слепое пятно для многих студентов, использующих Java. По этой причине я объясняю Stream так подробно. На протяжении всего этого Я считаю, что пока ученики, которые внимательно его прочитали, они почти усвоили его, а в реальном бою это практически невозможно. На самом деле, в процессе моей работы Stream мне очень помог, поэтому я хочу поделиться с вами, вот и вышла эта серия статей. Когда была выпущена эта серия статей, многие студенты сообщили, что ни отладка потока Stream, ни отладка forEach () не особо удобны. Эта статья дает компромиссный метод отладки. Хотя он не может полностью решить проблему отладки, в основном это выше может решить большинство проблем отладки.Да, это итератор.Конечно, помимо помощи при отладке, наиболее важной является функция обхода. В дополнение к представлению традиционных итераторов в этой статье также будет представлен новый Spliterator в Java 8, поскольку Spliterator довольно прост в использовании в случае параллельных потоков.
Кратко представим традиционный итератор
Итератор — это объект, реализующий интерфейс Iterator, а интерфейс Iterator позволяет перемещаться, получать или удалять элементы.
Общие шаги по использованию Iterator:
- (1) Получите итератор, указывающий на начало коллекции или потока, с помощью метода iterator ().
- (2) Установите цикл вызова метода hasNext (), пока hasNext () возвращает true, продолжайте итерацию.
- (3) В цикле каждый элемент получается путем вызова метода next ().
Но если мы не изменяем коллекцию, использование forEach () на самом деле более удобно. Фактически, эти два метода по сути одинаковы. После компиляции forEach () будет преобразован в итератор для работы. Я считаю, что с итераторами отладка будет более удобной.Даже если вы не можете отлаживать напрямую, вы можете использовать итераторы, чтобы отменить то, что могло случиться раньше.
Стоит отметить, что Java 8 предоставляет дополнительные итераторы для основных типов потоков: PrimitiveIterator.OfInt, PrimitiveIterator.OfDouble, PrimitiveIterator.OfLong, PrimitiveIterator, но все эти интерфейсы являются расширением интерфейса Iterator, поэтому то же самое используется выше.
Spliterator
Spliterator — это новый итератор Java8, состоящий из Spliterator Определение интерфейса, Spliterator также имеет обычную функцию обхода элементов, которая похожа на только что упомянутый итератор, но метод Spliterator и метод использования итераторов отличаются. Кроме того, он предоставляет больше функций, чем Iterator. Наконец, Spliterator поддерживает параллельную итерацию.
Использовать Spliterator для основных итеративных задач очень просто. Вам нужно только вызвать метод tryAdvance (), пока он не вернет false. Если вы хотите применить одно и то же действие к каждому элементу в последовательности, то forEachRemaining () предоставляет более эффективный альтернативный метод. . Для этих двух методов действия, которые будут происходить на каждой итерации, определяются Consumer Определяется операцией, определяемой объектом, Consumer Это также функциональный интерфейс. Я думаю, вы уже знаете, как его анализировать. Я не буду брать вас анализировать его здесь. Его действие — указать операцию, которая будет выполняться над следующим элементом в итерации. Вот простой пример:
Используйте метод forEachRemaining (), чтобы улучшить этот пример:
Обратите внимание, что при использовании этого метода вам не нужно предоставлять цикл для обработки одного элемента за раз, а обрабатывать каждый элемент как единое целое, что является еще одним преимуществом Spliterator.
Другой примечательный метод Spliterator — trySplit (), который делит повторяемый элемент на две части и возвращает одну часть нового Spliterator, а доступ к другой части осуществляется через исходный Spliterator. Вот еще один простой пример
Это просто предоставить вам этот метод.Сам пример не имеет смысла, но когда вы выполняете параллельную обработку больших наборов данных, разбиение может быть чрезвычайно полезным. Но в большинстве случаев, когда вы хотите выполнять параллельные операции с потоком, лучше использовать один из других методов Stream вместо того, чтобы вручную обрабатывать эти детали Spliterator.Самый подходящий сценарий для Spliterator — это когда все указанные методы не может удовлетворить ваши требования., просто подумайте.
Наконец, резюме
К этому моменту в основном были представлены знания Java 8 Stream. Операции сокращения, параллельные потоки, сопоставление и сбор данных являются основным содержимым Stream. Но если вы хотите освоить это содержимое, вам необходимо запустить вторую часть базовые знания. Не могу отбросить, поэтому мой совет по-прежнему честен, внимательно прочтите первую статью, после прочтения этих 7 статей вы в основном очень систематически овладели знаниями Java 8 Stream, не забывайте Collectors Класс и методы, предоставленные нам, могут в основном обрабатывать различные элементы коллекций. Если вы читали это из первой статьи, тогда вы попытаетесь использовать Stream как можно больше для работы с коллекциями. Что ж, бесполезно изучите эти знания. Вы должны больше использовать их в своих проектах, чтобы вы могли лучше понимать. Если вы столкнетесь с какими-либо проблемами в процессе, пожалуйста, оставьте сообщение здесь. Я видел это, и я должен изучить решение вместе со всеми как можно скорее. Если вам интересна моя статья, вы тоже можете обратить на нее внимание.Позже, думаю, я опубликую серию статей о структурах данных, конечно, целую серию структур данных на Java. Если вы думаете об этой серии статей о Stream, вы можете сравнить ее
Если вы понимаете, то я полагаю, что вы почувствуете то же самое в статьях серии о структурах данных. Наконец, спасибо всем. Я желаю вам все больше и больше мощных навыков, больше и больше счастливая жизнь, самое главное — сразу найти девушку, хахахаха.
Ревью 7. Ревью 7 — Функциональные Интерфейсы, Streams. Чем является Stream в контексте Java 3 Для чего нужен 3
Единственный в мире Музей Смайликов
Самая яркая достопримечательность Крыма
Скачать 84.11 Kb.
Чем является Stream в контексте Java?
Интерфейс java.util.Stream представляет собой последовательность элементов, над которой можно производить различные операции.
Stream API — это новый способ работать со структурами данных в функциональном стиле. Stream (поток) API (описание способов, которыми одна компьютерная программа может взаимодействовать с другой программой) — это по своей сути поток данных. Сам термин «поток» довольно размыт в программировании в целом и в Java в частности.
Для чего нужен?
Какие бывают стримы?
Java Stream API предлагает два вида методов:
1. Конвейерные — возвращают другой stream, то есть работают как builder,
2. Терминальные — возвращают другой объект, такой как коллекция, примитивы, объекты, Optional и т.д.
Общее правило: у stream’a может быть сколько угодно вызовов конвейерных вызовов и в конце один терминальный, при этом все конвейерные методы выполняются лениво и пока не будет вызван терминальный метод никаких действий на самом деле не происходит, так же как создать объект Thread или Runnable, но не вызвать у него start.
Java streams vs Iterators
I have been playing with the new and shiny functional part of Java and one of the things that puzzle me the most are streams?
What is their use?
On Google I mostly found explanations of how to use them and practical examples, which I already got down, nothing concrete about the magic behind the scenes, which is what interests me.
I dont mean in a practical sense, coming from a few functional languages i figured out map/filter/reduce/etc. fairly quickly but why do we need to convert to a stream first? Java already has iterators. Is there a fundamental difference between stream and iterator like one being lazy and the other not? Or is it something else?
Bottom line: what is the fundamental difference between iterators and streams and what functionality couldn’t be implemented as an extension to iterators and needed a whole new family of types?
![]()
5 Answers 5
Talking about streams, in general, is a vast topic. However, I will derive about why you should favour the streams API over Iterators.
First and foremost, with the stream API, we can now program at a much higher level of abstraction, just like SQL queries, i.e. we express what we want and let the library handle the rest.
Second, stream operations perform their iterations behind the scenes (internal iteration) , this means the processing of the data could be done in parallel or in a different order that may be more optimized.
On the other hand, if you decide to explicitly iterate over your collection to perform some computation whether that’s with an Iterator or the syntactic sugar for an iterator (the enhanced for loop) then you’re explicitly taking the items in the collection and processing them one by one thus it’s inherently serial.
Using iterators instead of the stream API also means a lot more work has to be done when you want to go parallel or find different ways to optimise your program.
Yet, this also means that you’re spending much more time dealing with the low-level details instead of just focusing on what you want your program to do.
Also mentioned in the Java-8 in Action book:
The internal iteration in the Streams library can automatically choose a data representation and implementation of parallelism to match your hardware. By contrast, once you’ve chosen external iteration by writing for-each, then you’ve essentially committed to self-manage any parallelism. (Self-managing in practice means either “one fine day we’ll parallelize this” or “starting the long and arduous battle involving tasks and synchronized”.)
Java 8 needed an interface like Collection but without iterators, ergo Stream!
Essentially, with the stream API, your life is much easier in many ways but what I find most useful is the fact that you can now put more time into focusing on what you want your code to do and at the same time you can decide to go parallel without dealing with the low-level stuff.
This is of course not saying to always utilise streams wherever/whenever possible. Rather it’s stating the benefits of using streams over Iterators.
There are certain places where it will be more appropriate to use Iterators rather than the stream API and vice versa. So choose wisely which approach to proceed with in terms of processing data in collections.