Best Jav Streaming

Best Jav Streaming



👉🏻👉🏻👉🏻 ALL INFORMATION CLICK HERE 👈🏻👈🏻👈🏻

































Best Jav Streaming



Все потоки


Разработка


Администрирование


Дизайн


Менеджмент


Маркетинг


Научпоп





















17,1% Да, но только в личных проектах 186


8,3% Лишь планируем использовать 90


3,3% Нет, предпочитаю старый подход 36


1,8% Нет, и мне все равно использовать или нет 19

Проголосовали 1085 пользователей. Воздержались 153 пользователя.



+21


79k


469


35





+29


152k


1532


27





+57


220k


1365


40


Проголосовал за production, но использую не Java 8 Stream, а библиотеку totallylazy ( https://github.com/bodar/totallylazy ) в сочетании с gradle-retrolambda, т.к. пишу под Android. Помимо Stream, которые там называются Sequence, там ещё много полезностей — в том числе, Option и Either.
Я пользуюсь Lightweight-Stream-API для андроида. Вы пользовались им? Если да, не могли бы вы описать, чем totallylazy отличается от урезанного Stream API?

Я первый раз слышу о totallylazy, раньше думал, что Lightweight-Stream-API единственная библиотека. К тому же, в репозитории написано, что это то же Stream API из джавы, только переписанное, чтобы работало на семёрке. Что может быть лучше, чем код из самой джавы.
Нет, не пользовался, но, судя по примерам кода, работа с «потоками» очень похожа. Но totallylazy ориентирована на функциональное программирование вообще, а Lightweight-Stream-API — именно на «потоки». Поэтому в Lightweight-Stream-API вы не найдёте всяких функторов, монад и т.п.
Подскажите, пожалуйста, какие-нибудь туториалы по totallylazy, если знаете? Конкретнее, именно по функциональному программированию. Можно ли с помощью totallylazy сохранять функцию в переменную? Обязательно посмотрю, что эта ленивая библиотека из себя представляет.

Спасибо!
По функциональному программированию вообще я бы рекомендовал бесплатную книгу «Learn You a Haskell for Great Good!» — http://learnyouahaskell.com/chapters
Первые несколько глав дают общее представление о ФП, дальше начинается самый сок и нарастает хардкорность. Книга забавно иллюстрирована и вообще написана интересно и с юмором. Сразу скажу, после долгого использования императивного стиля функциональный даётся не сразу, мешает инертность мышления. Не жалейте времени, перечитайте непонятные вещи несколько раз, если нужно. Как писал автор одной книги по теории чисел: «Если вы читаете больше одной страницы в час, возможно, вы слишком спешите». Поищите туториалы на Youtube. Разнообразнее источники информации только улучшат понимание темы.

Когда придёт понимание концепции ФП, для вас уже не будет проблемой использовать ту или иную библиотеку для этого — вы уже будете знать, что в ней искать и зачем. А по totallylazy я сам искал, но не нашёл — даже полноценных доков, не то что туториалов. Мои задачи она решает.

Что касается сохранения функции в переменную, вам это позволяет и Java 8 с её Lambda, functional interfaces и method references. Пример для Android:

final DialogInterface.OnClickListener clickListener = (dialog, which) -> {
switch (which) {
...
}
};

final AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setPositiveButton(R.string.yes, clickListener);
builder.setNegativeButton(R.string.no, clickListener);

или вот ещё:

class Example {
static void doSomething() {
...
}
}

final Runnable action = Example::doSomething;

Работает это потому, OnClickListener — интерфейс с одним методом, или «функциональный» интерфейс. Разумеется, Java в этом плане и рядом с Haskell не валялась, т.к. в последнем не нужны всякие специальные интерфейсы, и можно просто указать сигнатуру функции на месте типа, или вообще ничего не указывать, положившись на автоматическое выведение типов.
Ну Option и здесь есть (aka Optional), но лично мне не шибко нравится то, как это реализовано, в принципе. Если уж сделали в интерфейсах реализации по умолчанию, так можно было и стандартный Collections API доработать (для ленивых — интерфейс Iterator). Нет же, породили новую сущность. И всё равно реализация по умолчанию не является потокобезопасной. Казалось бы — зачем? и тут мы вспоминаем, что Java Collections API мутабельно чуть менее, чем полностью (а меньшая часть просто не даёт себя модифицировать).
И да, Either здесь нет, но реализуется достаточно просто (правда, без sealed traits придётся повозиться, чтобы защитить иерархию классов от нежелательного расширения).
Насчет distinct(), мне кажется вы ошиблись. Я думаю «For ordered streams, the selection of distinct elements is stable (for duplicated elements, the element appearing first in the encounter order is preserved.) For unordered streams, no stability guarantees are made.» означет что distinct() гарантировано работает только если список отсортирован. На синтетических примерах с примитивами это не имеет значения, но я столкнулся с проблемой когда у меня список содержал кучу объектов с переопределенным equals(), но нереализованым компаратором для сортировки. Применение distinct() к такому списку не давала ничего. Из нескольких миллионов записей ни одна не убиралась.
Спасибо за замечание, но мне кажется в фразе «For ordered streams, the selection of distinct elements is stable (for duplicated elements, the element appearing first in the encounter order is preserved.) For unordered streams, no stability guarantees are made.» речь идет о таком свойстве сортировки как «Устойчивость (англ. stability) — устойчивая сортировка не меняет взаимного расположения элементов с одинаковыми ключами» вики .

Это подтверждает и дальнейшее замечание в javadoc :
API Note:
Preserving stability for distinct() in parallel pipelines is relatively expensive (requires that the operation act as a full barrier, with substantial buffering overhead), and stability is often not needed. Using an unordered stream source (such as generate(Supplier)) or removing the ordering constraint with BaseStream.unordered() may result in significantly more efficient execution for distinct() in parallel pipelines, if the semantics of your situation permit. If consistency with encounter order is required, and you are experiencing poor performance or memory utilization with distinct() in parallel pipelines, switching to sequential execution with BaseStream.sequential() may improve performance.

Очень странно что у вас distinct не работал, а можете дать пример вашего класса и несколько значений в личку?
Да, у вас hashCode тоже переопределен в соответствии с контрактами (в частности, что все equals объекты всегда имеют один и тот же hashCode)? Так как если я правильно понимаю работу distinct он работает по принципу HashSet, то есть сначала сортирует по hashCode, а уже потом среди объектов с одинаковым hashCode начинает проверять на equals, соответственно при нарушении контракта hashCode/equals ничего работать не будет.
Правда ваша. Я вышел из этой ситуации обернув класс в обертку перед distinct(), а обертка как раз добавляет equals и hashcode. Косяк конечно мой, но этот камень можете указать где-нибудь в примечаниях, что distict() работает на классах при наличии hashcode и equals. Хорошая у Вас статья, stream() очень приятная штука.
А почему reduce() не в терминальных операциях?
Спасибо, поправил. Изначально я вообще забыл добавить recude в таблицу, а когда обнаружил вставил не в ту таблицу.
Важный момент:
allMatch(условие) вернет true для пустого стрима!
а anyMatch(то же условие) для пустого стрима вернет false!
НЛО прилетело и опубликовало эту надпись здесь
Добавил новую часть шпаргалок — шпаргалка по Java SE 8
Наткнулся на фичу, которая может создать неочевидную проблему…
В общем Stream.of(...).peek(s->System.out.println(«PEEK:S»)).X
В случае X=.forEach(System.out.println(«FOR:S»)) выдаст PEEK:S\nFOR:S…
А в случае X=.count() — ничего не выдаст, что неочевидно, так как ожидается PEEK:S…
Статья просто супер! Спасибо громадное!!!



Дата основания
1 апреля 2000 г.



Локация

Москва Россия




Сайт
luxoft.com



Численность
5 001–10 000 человек



Дата регистрации
15 января 2010 г.





Испытай свои возможности в новой игре для разработчиков от Luxoft! Сотрудничай с программистами со всего мира чтобы построить город и спасти мир от пришельцев!



+84


27,8k


94


293




+52


36,6k


168


164




+32


26,4k


92


146




+10


22,1k


2


107





Публикации


Новости


Хабы


Компании


Пользователи


Песочница






Устройство сайта


Для авторов


Для компаний


Документы


Соглашение


Конфиденциальность






Реклама


Тарифы


Контент


Семинары


Мегапроекты


Мерч



Только зарегистрированные пользователи могут участвовать в опросе. Войдите , пожалуйста.
Вообще, было бы странно, если бы оно работало иначе.
Только в одном месте, где пример про список строк, действительно должно быть orElse(«0»). Поправил
Только  полноправные пользователи могут оставлять комментарии. Войдите , пожалуйста.
1. Классический: Создание стрима из коллекции
Collection collection = Arrays.asList("a1", "a2", "a3");
Stream streamFromCollection = collection.stream();

Stream.of ( значение1 ,… значениеN )
Stream streamFromValues = Stream.of("a1", "a2", "a3");

String[] array = {"a1","a2","a3"};
Stream streamFromArrays = Arrays.stream(array);

4. Создание стрима из файла (каждая строка в файле будет отдельным элементом в стриме)
Stream streamFromFiles = Files.lines(Paths.get("file.txt"))

IntStream streamFromString = "123".chars()

Stream. builder (). add (...).... build ()
Stream.builder().add("a1").add("a2").add("a3").build()

Stream stream = collection.parallelStream();


8. Создание бесконечных стрима с помощью Stream.iterate

Stream.iterate ( начальное_условие , выражение_генерации )
Stream streamFromIterate = Stream.iterate(1, n -> n + 1)

9. Создание бесконечных стрима с помощью Stream.generate
Stream.generate ( выражение_генерации )
Stream streamFromGenerate = Stream.generate(() -> "a1")

Отфильтровывает записи, возвращает только записи, соответствующие условию
collection.stream().filter(«a1»::equals).count()
Позволяет пропустить N первых элементов
collection.stream().skip(collection.size() — 1).findFirst().orElse(«1»)
Возвращает стрим без дубликатов (для метода equals)
collection.stream().distinct().collect(Collectors.toList())
collection.stream().map((s) -> s + "_1").collect(Collectors.toList())
Возвращает тот же стрим, но применяет функцию к каждому элементу стрима
collection.stream().map(String::toUpperCase).peek((e) -> System.out.print("," + e)).
collect(Collectors.toList())
Позволяет ограничить выборку определенным количеством первых элементов
collection.stream().limit(2).collect(Collectors.toList())
Позволяет сортировать значения либо в натуральном порядке, либо задавая Comparator
collection.stream().sorted().collect(Collectors.toList())
mapToInt ,
mapToDouble ,
mapToLong
Аналог map, но возвращает числовой стрим (то есть стрим из числовых примитивов)
collection.stream().mapToInt((s) -> Integer.parseInt(s)).toArray()
flatMap ,
flatMapToInt ,
flatMapToDouble ,
flatMapToLong
Похоже на map, но может создавать из одного элемента несколько
collection.stream().flatMap((p) -> Arrays.asList(p.split(",")).stream()).toArray(String[]::new)
Возвращает первый элемент из стрима (возвращает Optional)
collection.stream().findFirst().orElse(«1»)
Возвращает любой подходящий элемент из стрима (возвращает Optional)
collection.stream().findAny().orElse(«1»)
Представление результатов в виде коллекций и других структур данных
collection.stream().filter((s) -> s.contains(«1»)).collect(Collectors.toList())
Возвращает количество элементов в стриме
collection.stream().filter(«a1»::equals).count()
Возвращает true, если условие выполняется хотя бы для одного элемента
collection.stream().anyMatch(«a1»::equals)
Возвращает true, если условие не выполняется ни для одного элемента
collection.stream().noneMatch(«a8»::equals)
Возвращает true, если условие выполняется для всех элементов
collection.stream().allMatch((s) -> s.contains(«1»))
Возвращает минимальный элемент, в качестве условия использует компаратор
collection.stream().min(String::compareTo).get()
Возвращает максимальный элемент, в качестве условия использует компаратор
collection.stream().max(String::compareTo).get()
Применяет функцию к каждому объекту стрима, порядок при параллельном выполнении не гарантируется
set.stream().forEach((p) -> p.append("_1"));
Применяет функцию к каждому объекту стрима, сохранение порядка элементов гарантирует
list.stream().forEachOrdered((p) -> p.append("_new"));
collection.stream().map(String::toUpperCase).toArray(String[]::new);
Позволяет выполнять агрегатные функции на всей коллекцией и возвращать один результат
collection.stream().reduce((s1, s2) -> s1 + s2).orElse(0)
collection.stream().mapToInt((s) -> Integer.parseInt(s)).sum()
Возвращает среднее арифметическое всех чисел
collection.stream().mapToInt((s) -> Integer.parseInt(s)).average()
Преобразует числовой стрим обратно в объектный
intStream.mapToObj((id) -> new Key(id)).toArray()
Узнать является ли стрим параллельным
Вернуть параллельный стрим, если стрим уже параллельный, то может вернуть самого себя
Вернуть последовательный стрим, если стрим уже последовательный, то может вернуть самого себя
Вернуть количество вхождений объекта «a1»
collection.stream().filter(«a1»::equals).count()
Вернуть первый элемент коллекции или 0, если коллекция пуста
collection.stream().findFirst().orElse(«0»)
Вернуть последний элемент коллекции или «empty», если коллекция пуста
collection.stream().skip(collection.size() — 1).findAny().orElse(«empty»)
Найти элемент в коллекции равный «a3» или кинуть ошибку
collection.stream().filter(«a3»::equals).findFirst().get()
Вернуть третий элемент коллекции по порядку
collection.stream().skip(2).findFirst().get()
Вернуть два элемента начиная со второго
collection.stream().skip(1).limit(2).toArray()
collection.stream().filter((s) -> s.contains(«1»)).collect(Collectors.toList())
Выбрать мужчин-военнообязанных (от 18 до 27 лет)
peoples.stream().filter((p)-> p.getAge() >= 18 && p.getAge() < 27
&& p.getSex() == Sex.MAN).collect(Collectors.toList())
peoples.stream().filter((p) -> p.getSex() == Sex.MAN).
mapToInt(People::getAge).average().getAsDouble()
Найти кол-во потенциально работоспособных людей в выборке (т.е. от 18 лет и учитывая что женщины выходят в 55 лет, а мужчина в 60)
peoples.stream().filter((p) -> p.getAge() >= 18).filter(
(p) -> (p.getSex() == Sex.WOMEN && p.getAge() < 55) || (p.getSex() == Sex.MAN && p.getAge() < 60)).count()
Получение коллекции без дубликатов из неупорядоченного стрима
nonOrdered.stream().distinct().collect(Collectors.toList())
[a1, a2, a3] —
порядок не гарантируется
Получение коллекции без дубликатов из упорядоченного стрима
ordered.stream().distinct().collect(Collectors.toList());
[a1, a2, a3] —
порядок гарантируется
Найти существуют ли хоть один «a1» элемент в коллекции
collection.stream().anyMatch(«a1»::equals)
Найти существуют ли хоть один «a8» элемент в коллекции
collection.stream().anyMatch(«a8»::equals)
Найти есть ли символ «1» у всех элементов коллекции
collection.stream().allMatch((s) -> s.contains(«1»))
Проверить что не существуют ни одного «a7» элемента в коллекции
collection.stream().noneMatch(«a7»::equals)
Добавить "_1" к каждому элементу первой коллекции
collection1.stream().map((s) -> s + "_1").collect(Collectors.toList())
В первой коллекции убрать первый символ и вернуть массив чисел (int[])
collection1.stream().mapToInt((s) -> Integer.parseInt(s.substring(1))).toArray()
Из второй коллекции получить все числа, перечисленные через запятую из всех элементов
collection2.stream().flatMap((p) -> Arrays.asList(p.split(",")).stream()).toArray(String[]::new)
Из второй коллекции получить сумму всех чисел, перечисленных через запятую
collection2.stream().flatMapToInt((p) -> Arrays.asList(p.split(",")).stream().mapToInt(Integer::parseInt)).sum()
Отсортировать коллекцию строк по алфавиту
collection.stream().sorted().collect(Collectors.toList())
Отсортировать коллекцию строк по алфавиту в обратном порядке
collection.stream().sorted((o1, o2) -> -o1.compareTo(o2)).collect(Collectors.toList())
Отсортировать коллекцию строк по алфавиту и убрать дубликаты
collection.stream().sorted().distinct().collect(Collectors.toList())
Отсортировать коллекцию строк по алфавиту в обратном порядке и убрать дубликаты
collection.stream().sorted((o1, o2) -> -o1.compareTo(o2)).distinct().collect(Collectors.toList())
Отсортировать коллекцию людей по имени в обратном алфавитном порядке
peoples.stream().sorted((o1,o2) -> -o1.getName().compareTo(o2.getName())).collect(Collectors.toList())
[{'Петя'}, {'Иван Иванович'}, {'Елена'}, {'Вася'}]

Отсортировать коллекцию людей сначала по полу, а потом по возрасту
peoples.stream().sorted((o1, o2) -> o1.getSex() != o2.getSex()? o1.getSex().
compareTo(o2.getSex()): o1.getAge().compareTo(o2.getAge())).collect(Collectors.toList())
[{'Вася'}, {'Петя'}, {'Иван Иванович'}, {'Елена'}]
Найти максимальное значение среди коллекции строк
collection.stream().max(String::compareTo).get()
Найти минимальное значение среди коллекции строк
collection.stream().min(String::compareTo).get()
Найдем человека с максимальным возрастом
peoples.stream().max((p1, p2) -> p1.getAge().compareTo(p2.getAge())).get()
{name='Иван Иванович', age=69, sex=MAN}
Найдем человека с минимальным возрастом
peoples.stream().min((p1, p2) -> p1.getAge().compareTo(p2.getAge())).get()
collection.stream().reduce((s1, s2) -> s1 + s2).orElse(0)
collection.stream().reduce(Integer::max).orElse(-1)
collection.stream().filter(o -> o % 2 != 0).reduce((s1, s2) -> s1 + s2).orElse(0)
представляют стрим в виде списка, коллекции или множества
позволяют преобразовать стрим в map
averagingInt, averagingDouble, averagingLong
summingInt, summingDouble, summingLong
summarizingInt, summarizingDouble, summarizingLong
возвращают SummaryStatistics с разными агрегатными значениями
разделяет коллекцию на две части по соответствию условию и возвращает их как Map
разделяет коллекцию на несколько частей и возвращает Map>
дополнительные преобразования значений для сложных Collector'ов
numbers.stream().collect(Collectors.summingInt(((p) -> p % 2 == 1? p: 0)))
Вычесть от каждого элемента 1 и получить среднее
numbers.stream().collect(Collectors.averagingInt((p) -> p — 1))
Прибавить к числам 3 и получить статистику
numbers.stream().collect(Collectors.summarizingInt((p) -> p + 3))
IntSummaryStatistics{count=4, sum=22, min=4, average=5.5, max=7}
Разделить числа на четные и нечетные
numbers.stream().collect(Collectors.partitioningBy((p) -> p % 2 == 0))
strings.stream().distinct().collect(Collectors.toList())
Получить массив строк без дубликатов и в верхнем регистре
strings.stream().distinct().map(String::toUpperCase).toArray(String[]::new)
Объединить все элементы в одну строку через разделитель: и обернуть тегами
strings.stream().collect(Collectors.joining(": ", " ", " "))
Преобразовать в map, где первый символ ключ, второй символ значение
strings.stream().distinct().collect(Collectors.toMap((p) -> p.substring(0, 1), (p) -> p.substring(1, 2)))
Преобразовать в map, сгруппировав по первому символу строки
strings.stream().collect(Collectors.groupingBy((p) -> p.substring(0, 1)))
Преобразовать в map, сгруппировав по первому символу строки и объединим вторые символы через :
strings.stream().collect(Collectors.groupingBy((p) -> p.substring(0, 1), Collectors.mapping((p) -> p.substring(1, 2), Collectors.joining(":"))))

Java streams best practices | Programming is Magic
Шпаргалка Java программиста 4. Java Stream API... / Хабр
What is the best practice for managing Java 8 streams with...
Functional Programming With Java : Streams | Medium
A Guide to Java Streams in Java 8: In-Depth Tutorial With...


Sign up with email
Sign up




Sign up with Google



Sign up with GitHub



Sign up with Facebook




Asked
2 years, 11 months ago


Active
2 years, 11 months ago


java collections foreach java-8 java-stream



why would you want to, just keep the code as is.

–  luk2302
Feb 24 '18 at 20:10



I wouldn't. And what is areaModels ?

–  Andreas
Feb 24 '18 at 20:10


101k 12 12 gold badges 149 149 silver badges 166 166 bronze badges



Thanks, this is the answer I was looking for.

–  Rado
Feb 24 '18 at 20:30



@davidxxx there is IntSummaryStatistics that do more then one thing at a time, nothing wrong with that. A custom collector is more than fine here

–  Eugene
Feb 25 '18 at 11:26



@Eugene Right but could we not consider that collecting statistics is getting one thing : statistics ? Besides, it is a standard and provided out of the box. The OP wants to collecting multiple instances of custom classes. I think that it is a different requirement. About creating a custom collector, I disagree. The code of the Federico Peralta Schaffner answers that uses this way is interesting but requires more boiler plate code to perform something that the original code of the OP performs in a straighter way. I would use it but not in any case. I updated my answer.

–  davidxxx
Feb 25 '18 at 18:07






@davidxxx that is exactly what the OP asked, same thing via java-8 or a single pass, multiple results == custom collector, that the other answer has shown. You are correct, that wahtever the OP has in place is good, just that there is a way to do it in java-8...

–  Eugene
Feb 25 '18 at 19:51



@Federico Peralta Schaffner I get your point. To sum it, in theory, it could be faster but in the facts the suitable use case is rare. Thanks for your interesting feedback !

–  davidxxx
Feb 26 '18 at 19:07


29.9k 6 6 gold badges 49 49 silver badges 94 94 bronze badges



that's really inefficient code as per me. You actually need only one object of Result but in combiner you have to pass a new object all the time. In reality performance of this code should be very bad. @federico what's your say on that

–  Vinay Prajapati
Feb 25 '18 at 12:05



@VinayPrajapati that's by contract, you must provide a combiner, even for sequential streams, though in this case it could be a dummy combiner or one that throws an exception. If the stream is parallel, the stream API automatically splits the elements into chunks and processes every chunk in parallel, so there must be a way to combine the results back together. On the contrary, for a very large number of elements, it's worth splitting, processing and combining. For few elements it's not worth mounting all the required infrastructure to process the stream pipeline in parallel.

–  fps
Feb 25 '18 at 15:30





132k 8 8 gold badges 107 107 silver badges 186 186 bronze badges



Exactly what I was thinking and was halfway through my answer ;). but it would be nice to state that you've avoided performing the logic in a single pass over the dataset to avoid side effects and thus one wouldn't want to go parallel with it.

–  Ousmane D.
Feb 24 '18 at 20:24






Yes, But that means you are iterating through the list 3 times? Correct?

–  Rado
Feb 24 '18 at 20:26



@Rado So what? The iteration itself takes no time. The problem would be if getWebsiteModel() is slow, then calling it thrice is bad. But as a simple getter, that takes no time either, so there is no downside to doing it 3 times.

–  Andreas
Feb 24 '18 at 20:26






This code is mor less just an example. I was curious if there is some regular way how to write this using streams, it looks like there is not;). Thank you very much for your reactions...

–  Rado
Feb 24 '18 at 20:32

Backend Software Engineer, Creator Tooling
Independent & Self-motivated Senior Python Backend Developer
Ruby on Rails Developer (m/w/d) - Remote
Software Engineer (Scala) - Offer Team

Stack Overflow

Questions
Jobs
Developer Jobs Directory
Salary Calculator
Help
Mobile
Disable Responsiveness


Products

Teams
Talent
Advertising
Enterprise



Company

About
Press
Work Here
Legal
Privacy Policy
Terms of Service
Contact Us



Stack Exchange Network

Technology
Life / Arts
Culture / Recreation
Science
Other


Join Stack Overflow to learn, share knowledge, and build your career.
How to process forEach in Java 8 using streams when I want to have multiple results from the iteration. Of course calling List.add method in stream forEach operation is not an option... How would you rewrite this code using Java 8 streams?
What is the best practice for managing Java 8 streams with multiple
results
Of course calling List.add method in stream forEach operation is not
an option.
The best practice is not forcing you to use streams as the use case is not appropriate.
The Stream interface javadoc describes itself as :
A sequence of elements supporting sequential and parallel aggregate
operations.
Stream operations return themselves a sequence of typed elements.
So Stream collects will return finally a single kind of thing based on the type of the sequence of elements : unitary or a collection of.
We could for example collect a Foo , a List of Foo , a Map of Foo indexed by Integer keys, and so for...
Stream collects are not designed to collect different custom things such as a List of Foo + a List of Bar + the count of Bar + Foo .
As @Eugene underlined, Streams also provide a way to get IntSummaryStatistics that is a set of things : common aggregates that are minimum, maximum, sum, and average.
But should we not consider that it collects finally a single thing : statistics ?
putting aside Stream for your use case and keeping the for loop.
using multiple streams : one stream by custom thing that you want to collect.
using a single stream with a custom collector.
I would not use the second way in any case as it will produce a less readable and straight code that your actual.
About the last way (custom collector) illustrated by the Federico Peralta Schaffner answer. It is straighter and it allows to benefit from stream parallelism. So it is an option to consider.
But it also requires more boiler plate code and has more reading indirection to understand the actual logic.
So I think that I would introduce a custom collector only in two cases :
And in any other cases, I would keep the for loop.
The way to do things like this with streams is to use a custom collector. Suppose we define the following class:
With this Results class in place, you're ready to collect the results:
This uses the Stream.collect method. The first argument is a Supplier that creates the mutable object into which elements of the stream are to be accumulated via the accumulator provided in the second argument. The third argument is a merger that will only be used to combine partial results if the stream is parallel.

By clicking “Post Your Answer”, you agree to our terms of service , privacy policy and cookie policy

To subscribe to this RSS feed, copy and paste this URL into your RSS reader.

site design / logo © 2021 Stack Exchange Inc; user contributions licensed under cc by-sa . rev 2021.2.10.38546


Milfs Wearing Stockings
Hot Girls Working Out Naked
Shaved Young Pussies
Pictures Of Girls Doing Sex
Porn Close Up Hd

Report Page