Java 8: Хороша практика передавати потоки в API для ледачих операцій?


12

У бібліотеках, що мають важкі лямбда-файли перед Java 8, такими як Guava, виводи використовують загальні інтерфейси Java Collection Framework, тому їх легко передати зовнішнім / внутрішнім API і все-таки використати деякі ледачі обчислення, якщо бібліотечний метод це робить (наприклад, ледачий filter()і transform()).

Однак у Java 8 Streams виклик отримати a Collection/ Mapis термінал (тобто нетерплячий), і він також виділить нові структури даних для отримання результатів.

Для складних обчислень з декількома етапами та схемою стратегії в середині це спричиняє багато непотрібних виділень через проміжні результати.

Отже, чи вважають люди гарною практикою для внутрішніх API (тобто стратегій стратегічних схем) приймати та повертати Streams, або я повинен просто відмовитися від ледачих, але не впорядкованих (пені призначений я думаю) API Guava?

Редагувати:

Моє головне питання Streamполягає в тому, що його можна вживати лише один раз і передавати щось на зразок Supplier<Stream<X>>виглядає надзвичайно громіздко. Це майже підштовхує вас просто пройти Collectionта потім повторити stream()його (і заплатити вартість нетерплячої оцінки в цей момент).


Що, Guava та друзі не оновлюються, щоб скористатися нативними потоками?
Кіліан Фот

1
Наявність інтерфейсів, які приймають і повертають потоки, дійсно покращує сумісність зі стандартними функціональними потоками. Це дозволяє інтегрувати дзвінки до вашого інтерфейсу в потоковий конвеєр.
Філіп

@KilianFoth Вже майже рік не було жодного випуску Guava, і є багато популярних статей про заміну лямбда-матеріалів Guava на Stream; однак жодна з них не звертається до факту, що операції збору Guava можуть бути нетерплячими або ледачими.
billc.cn

Відповіді:


3

Лінь у Java 8 Streams працює так само, як це було раніше для Iterables у Guava: вам потрібно передати Iterable, щоб не лінуватися, а оцінка станеться, коли ви створили колекцію з Iterator. І потоки, і ітератори можна вживати лише один раз.

Отже, для ваших методів інтерфейсів більш загальним способом (дозволяючи лінь) є використання інтерфейсу Stream (коли б ви раніше використовували Iterable). Як говорить @Philipp, це дозволяє використовувати їх у потокових трубопроводах.

Сподіваємось, оскільки Stream зараз є офіційним стандартним інтерфейсом Java, з'явиться все більше інших бібліотек і функцій, які можуть ефективно працювати над Streams безпосередньо.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.