openjdk.ruOpenJDK на русском

JEP 107: Bulk Data Operations for Collections

Массовые операции над данными для коллекций

ОтветственныйMike Duigou
ТипFeature
ОбластьSE
СтатусClosed / Delivered
Выпуск8
Компонентcore-libs
JSR335
Обсуждениеlambda dash dev at openjdk dot java dot net
ТрудоёмкостьL
ДлительностьXL
Зависит отJEP 109: Enhance Core Libraries with Lambda
JEP 126: Lambda Expressions & Virtual Extension Methods
ОдобренBrian Goetz
Создан2011/09/23 20:00
Обновлён2024/04/22 16:06
Задача8046097

Аннотация

Добавить в Java Collections Framework возможность выполнять массовые операции над данными. Обычно это называют «filter/map/reduce для Java». Массовые операции над данными будут в двух вариантах: последовательном (в вызывающем потоке) и параллельном (во многих потоках). Операции над данными, как правило, записываются в виде лямбда-функций.

Цели

Предоставить новые возможности массовой обработки данных с помощью лямбда-функций, в том числе параллельные операции

Что не является целью

Перевести существующие случаи использования на параллельные операции.

Мотивация

Ближе всего к этому FlumeJava, которую Google использует внутри компании, и PLinq от Microsoft. Linq и Plinq особенно высоко ценят разработчики .NET, и им сильно завидуют разработчики на Java.

Больше всего выиграют разработчики, которые сейчас создают однопоточные приложения для бизнес-процессов. Ожидается, что возможность использовать конкурентность при минимальных изменениях в приложении принесёт им огромную пользу.

Описание

Последовательная реализация служит переходом от существующих массовых операций над данными в коллекциях к параллельным операциям и не меняет модель потоков приложения.

Главный элемент этой возможности — параллельная реализация. Параллельные операции позволяют ускорить обработку больших объёмов данных, разделив задачу между несколькими потоками (процессорами). Параллельная реализация построена на реализации Fork/Join из java.util.concurrency, появившейся в Java 7.

И у последовательной, и у параллельной реализации возможны «энергичный» (eager) и «ленивый» (lazy) режимы. В энергичном режиме операции выполняются над данными непосредственно в момент вызова функции операции. В ленивом режиме операции над данными откладываются до тех пор, пока не будет запрошен итоговый результат. Ленивый режим даёт реализации больше возможностей для оптимизации за счёт перестройки данных и выполняемых операций.

Тестирование

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

Для полного тестирования этой работы потребуются значительные аппаратные ресурсы, т. е. выделенные системы с 8 и более ядрами для всех основных поддерживаемых платформ.

Зависимости

  • Изменения языка в рамках Lambda
  • Изменения базовых библиотек, описанные в JEP 109
  • Участие экспертных групп JSR 335 EG и JSR 166 EG и в особенности Дага Ли (Doug Lea)

Влияние

  • Совместимость: только прямая совместимость
  • Безопасность: стандартно
  • Производительность и масштабируемость: требуются значительный объём тестирования и бенчмарки
  • Пользовательский опыт: нет
  • I18n/L10n: нет
  • Переносимость: реализация на 100 % на java. Нативный код не планируется.
  • Упаковка и установка: поставляется в составе установки JRE
  • Документация: стандартно
  • TCK: особых требований нет. Потребуются новые тесты TCK.
  • Интернационализация: как у JCF
  • Локализация: нет