Скачать java se-совместимую реализацию liberica jdk 11.0.6
Содержание:
- Недевелоперские фичи Java 11
- Настройка переменных окружения Java.
- Попытка 2: custom runtime
- Другие новые функции JDK
- Дистрибутивы Java
- Framework compatibility
- В java.nio.file.Files добавлены новые методы
- Как установить
- Metadata server
- Unmodifiable Collections
- JRE Installation Instructions for Windows
- Библиотеки
- В чем разница между версиями Java?
- Low-level stream construction
Недевелоперские фичи Java 11
privateNestHostNestMembersjava.lang.ClassClass getNestHost ()
Class [] getNestMembers ()
boolean isNestmateOf (Class)java.lang.MathJEP 315И в чём смысл?
- Прежде всего, этот сборщик мусора предназначен для того, чтобы новые алгоритмы GC были оценены с точки зрения их влияния на производительность. Идея состоит в том, чтобы запустить пример приложения с Epsilon и сгенерировать набор показателей. Включается новый алгоритм сборки мусора, запускаются те же тесты, а затем результаты сравниваются.
-
Для очень коротких задач (считайте безсерверные функции в облаке), где вы можете гарантировать, что не превысите память, выделенную куче. Это может повысить производительность за счет отсутствия накладных расходов (включая сбор статистики, необходимой для принятия решения о запуске коллектора) в коде приложения. Если пространство кучи исчерпано, JVM может быть сконфигурирован с ошибкой одним из трех способов:
- Вызывается обычный .
- Выполнить сброс кучи
- Сбой жесткого диска JVM и, возможно, выполнение другой задачи (например, запуск отладчика).
Flight RecorderFlight Recorder
- Предоставляет API для производства и потребления данных как событий
- Предоставляет буферный механизм и формат двоичных данных
- Разрешает настройку и фильтрацию событий
- Предоставлять события для ОС, JVM HotSpot и библиотек JDK
jdk.jfrjdk.management.jfrJEPобновлению шифров ChaCha20ChaCha20-Poly1305ChaCha20RC4TLS 1.3 (RFC 8446)
Настройка переменных окружения Java.
Выполните в консоли:
export JAVA_HOME=/opt/java/jdk-9/ export JRE_HOME=/opt/java/jdk-9/jre export PATH=$PATH:/opt/java/jdk-9/bin:/opt/java/jdk-9/jre/bin
После перезагрузки значения переменных окружения сбросятся. Чтобы не вводить эти значения каждый раз после перезагрузки можно отредактировать один из трёх файлов:
$HOME/.bashrc
ИЛИ
$HOME/.profile
ИЛИ
/etc/profile
Рекомендуется выбрать /etc/profile, поскольку в этом случае настройки будут доступны для всех пользователей системы. Откройте этот файл:
gedit /etc/profile
И добавьте в самый конец строки:
export JAVA_HOME=/opt/java/jdk-9/ export JRE_HOME=/opt/java/jdk-9/jre export PATH=$PATH:/opt/java/jdk-9/bin:/opt/java/jdk-9/jre/bin
Чтобы убедиться, опять проверим версию Java.
java -version
Вывод:
java version "9.0.1" Java(TM) SE Runtime Environment (build 9.0.1+11) Java HotSpot(TM) 64-Bit Server VM (build 9.0.1+11, mixed mode)
Предположение: Если вы не используете OpenJDK (открытую реализацию java), вы можете удалить её следующим образом:
sudo apt remove openjdk-*
Попытка 2: custom runtime
С момента выпуска jdk9 и модуляризации появилась возможность собрать собственный рантайм который содержит только те модули что необходимы вашему приложению. Детальнее об этой функциональности можно прочитать тут.
Попробуем определить необходимые модули для тестового spring boot приложения:
Окей, похоже что jdeps не может справиться с fat-jar созданным при помощи spring boot, но мы можем распаковать архив и прописать classpath:
По этому поводу на текущий момент открыт баг: https://bugs.openjdk.java.net/browse/JDK-8207162
Я попробовал скачать jdk12 чтобы получить эту информацию, но столкнулся со следующей ошибкой:
Методом проб, ошибок и поиска модулей по ClassNotFoundException я определил что моему приложению необходимы следующие модули:
- java.base
- java.logging
- java.sql
- java.naming
- java.management
- java.instrument
- java.desktop
- java.security.jgss
Рантайм для них можно собрать используя:
Попробуем построит базовый docker образ используя эту модули:
и соберем его:
В результате размер составил 106 мегабайт, что значительно меньше большинства найденных базовых образов с openjdk. Если использовать его для моего приложения, то результирующий размер получится 144 мегабайт.
Далее мы можем использовать как базовый образ для всех spring boot приложений если они имеют схожие зависимости. В случае различных зависимостей, возможно использовать multistage сборку образа для каждого из приложений где на первом этапе будет собираться java runtime, а на втором добавляться архив с приложением.
Другие новые функции JDK
JEP 230: набор микробенчмаркинга
Java Microbenchmarking Harness (JMH) был разработан Алексеем Шипилевым, когда он работал в Oracle, и предоставляет обширную платформу для разработки тестов производительности для приложений Java. Алексей проделал выдающуюся работу, помогая людям избежать многих простых ошибок, которые они допускают, пытаясь проанализировать производительность приложений: прогревать, избегать исключений, и т. д.
Теперь JMH может быть включено в OpenJDK. Любой, кто интересуется работой над самим JDK и изменением кода, может использовать это для сравнения производительности как до, так и после их изменений, а также для сравнения производительности в разных выпусках. Ряд тестов включены, чтобы включить тестирование; Дизайн JMH таков, что легко добавлять новые тесты туда, где это необходимо.
JEP 340: один порт Aarch64, а не два
OpenJDK имеет два порта для архитектуры Arm64, один из которых предоставлен Oracle, а другой — Red Hat. Поскольку в этом не было необходимости, и Oracle перестала поддерживать Arm для своих двоичных файлов JDK, было принято решение использовать только порт Red Hat, который все еще поддерживается и развивается.
JEP 341: архивы CDS по умолчанию
Класс Data Sharing (CDS) раньше был коммерческой функцией в Oracle JDK. С недавним переходом, выполненным в JDK 11, для устранения всех функциональных различий между Oracle JDK и OpenJDK, его включили в OpenJDK.
Для использования CDS требуется архив, созданный для классов, которые загружаются при запуске приложения. В JDK 12 для 64-разрядных платформ теперь есть файл в каталоге . Это архив CDS для «классов по умолчанию». Я предполагаю, что он означает все открытые классы в модулях JDK; Я не мог найти способ распаковать его, чтобы проверить. Поскольку CDS включен по умолчанию, что эквивалентно опции в командной строке, пользователи получат выгоду от улучшенного времени запуска приложений из него.
Дистрибутивы Java
Существует множество сайтов, предлагающих загрузку Java (читай: JDK), и неясно, «кто что предлагает и с каким лицензированием». Этот раздел проливает свет на это.
Проект OpenJDK
Однако это всего лишь исходный код, а не распространяемая сборка (представьте: ваш файл .zip со скомпилированной командой java для вашей конкретной операционной системы). Теоретически вы и я могли бы создать сборку из этого исходного кода, назвать ее, скажем, MarcoJDK, и начать ее дистрибуцию. Но наш дистрибутив не будет сертифицирован, чтобы можно было называть этот дистрибутив совместимым с Java SE.
И хотя поставщики не могут, скажем, удалить метод из класса String перед созданием новой сборки Java, они могут добавить брэндинг (вay!) или добавить некоторые другие утилиты (например, CLI), которые они считают полезными. Но в остальном исходный код одинаков для всех дистрибутивов Java.
Сборки OpenJDK (от Oracle) и OracleJDK
Один из поставщиков, который создает Java из исходного кода, — это Oracle. Это приводит к двум разным дистрибутивам Java, что поначалу может казаться очень запутанными.
Впрочем все сводится к тому, требуется ли вам коммерческая поддержка (номер телефона) для используемой версии Java.
Полный обзор дистрибутива OpenJDK
Рафаэль Винтерхальтер (Rafael Winterhalter) собрал большой список всех доступных сборок OpenJDK, включая их описания: ОС, архитектуру, окна лицензирования, поддержки и обслуживания.
Framework compatibility
With the App Engine Java 11 runtime, you can deploy executable JAR
files. The runtime
does not include any web-serving framework, meaning you are not limited to
using servlet-based frameworks or libraries. Use your native dependencies or
networking stacks such as the Netty library.
There are samples using popular Java web frameworks on the
Google Cloud GitHub repository:
- Spring Boot
- Vert.x
- SparkJava
- Ktor
- Micronaut
- Quarkus
You are not limited to these frameworks and are encouraged to try your
preferred one, like Grails, Blade, Play!, Vaadin or
jHipster.
Deploy Maven source projects to the Java 11 runtime
You can deploy your Maven project as source code and have it built and deployed
using App Engine Buildpacks.
To deploy a Maven project project as source code, go to your project’s top level
directory and type:
gcloud app deploy pom.xml
Build and deploy logs will be streamed, and you can see the detailed logs in the
Cloud Build history section in the Cloud Console.
Using GraalVM executables
The App Engine standard Java 11 runtime supports GraalVM native image
executables. Once you have compiled your Java 11 app using a GraalVM native
image, you can use the setting in your
file
to point to the executable.
For example, an executable with the filename could have the
following configuration file:
runtime: java11 entrypoint: ./myexecutable
В java.nio.file.Files добавлены новые методы
В
java.nio.file.Files (я уже как-то описывал его в ) добавлены методы для чтения содержимого файла в строки и для записи файла из строки.
Java
public static String readString(Path path) throws IOException
1 | publicstaticStringreadString(Path path)throwsIOException |
Читает содержимое файла в строку. Файл расценивается, как содержащий текст в кодировке UTF-8.
Java
public static String readString(Path path, Charset cs) throws IOException
1 | publicstaticStringreadString(Path path,Charset cs)throwsIOException |
Читает содержимое файла по пути
path в строку в указанной кодировке.
Java
public static Path writeString(Path path, CharSequence csq, OpenOption… options) throws IOException
1 | publicstaticPath writeString(Path path,CharSequence csq,OpenOption…options)throwsIOException |
Записывает последовательность символов
csq в файл в кодировке UTF-8.
Java
public static Path writeString(Path path, CharSequence csq, Charset cs, OpenOption… options) throws IOException
1 | publicstaticPath writeString(Path path,CharSequence csq,Charset cs,OpenOption…options)throwsIOException |
Записывает последовательность символов в файл с указанной кодировкой.
Пример использования:
Java
jshell> import java.nio.file.*;
jshell> Files.writeString(Paths.get(«myfile.txt»), «My string»);
$8 ==> myfile.txt
jshell> Files.readString(Paths.get(«myfile.txt»));
$9 ==> «My string»
1 |
jshell>importjava.nio.file.*; jshell>Files.writeString(Paths.get(«myfile.txt»),»My string»); $8==>myfile.txt jshell>Files.readString(Paths.get(«myfile.txt»)); $9==>»My string» |
Как установить
Инсталляция программы не займет много времени. Как правило, набор программиста устанавливается за 10-15 минут. Итак, чтобы провести инсталляцию утилиты, необходимо сначала скачать установщик на свой ПК. Сделать это можно у нас на сайте. Мы предоставляет различные версии JDK (в том числе и на русском). Также у нас имеется последняя версия набора (9.0.1). Все комплекты можно скачать через торрент.
Перед тем как скачать утилиту на компьютер, необходимо выбрать подходящий комплект
Как определить комплект, который подойдет к вашему компьютеру? В первую очередь необходимо обратить внимание на операционную систему. Тут все довольно-таки просто
Выбирайте ту ОС, которая установлена на вашем ПК. К примеру, если на компьютере стоит Windows XP, Windows 8 или же Windows 7, то в таком случае выбирайте пакет для Windows. Также надо обратить внимание на разрядность. Она указан в названии пакета (64 – 64-битная версия, 32 или i586 – 32-битная). Выбирайте тот пакет, который подходит под ваш ПК.
Как узнать какая разрядность у вашей системы? Откройте меню Пуск и введите в строке поиска «Компьютер». В разделе «Параметры» нажмите на пункт под названием «О компьютере». Появиться новое окно, в котором содержится вся информация о вашем ПК. Там же указан и разрядность системы.
Примечание. Если вы не нашли пакет, который подходит вашему ПК (например, у вас 32 bit система, а все наборы предназначены для 64 bit компьютеров), то попробуйте загрузить более раннюю версию ПО.
После того как установщик загрузился на ваш компьютер, нужно его открыть. Запуститься окно инсталлятора. В принципе тут никаких сложностей возникнуть не должно. Необходимо просто следовать всем инструкциям инсталлятора.
Примечание
Обратите внимание на директорию, в которую вы устанавливаете комплект разработчика. Стоит избегать адресов, в которых есть кириллические знаки
Ведь это может стать причиной того, что программа не устанавливается.
Metadata server
Each instance of your application can use the App Engine metadata server
to query information about the instance and your project.
You can access the metadata server through the following endpoints:
The following table lists the endpoints where you can make HTTP requests for
specific metadata:
Metadata endpoint | Description |
---|---|
The project number assigned to your project. | |
The project ID assigned to your project. | |
The zone the instance is running in. | |
The default service account email assigned to your project. | |
Lists all the default service accounts for your project. | |
Lists all the supported scopes for the default service accounts. | |
Returns the auth token that can be used to authenticate your application to other Google Cloud APIs. |
For example, to retrieve your project ID, send a request to
.
Unmodifiable Collections
Certain methods of this interface are considered «destructive» and are called
«mutator» methods in that they modify the group of objects contained within
the collection on which they operate. They can be specified to throw
if this collection implementation
does not support the operation. Such methods should (but are not required
to) throw an if the invocation would
have no effect on the collection. For example, consider a collection that
does not support the operation. What will happen if the
method is invoked on this collection, with an empty
collection as the argument? The addition of zero elements has no effect,
so it is permissible for this collection simply to do nothing and not to throw
an exception. However, it is recommended that such cases throw an exception
unconditionally, as throwing only in certain cases can lead to
programming errors.
An unmodifiable collection is a collection, all of whose
mutator methods (as defined above) are specified to throw
. Such a collection thus cannot be
modified by calling any methods on it. For a collection to be properly
unmodifiable, any view collections derived from it must also be unmodifiable.
For example, if a List is unmodifiable, the List returned by
is also unmodifiable.
An unmodifiable collection is not necessarily immutable. If the
contained elements are mutable, the entire collection is clearly
mutable, even though it might be unmodifiable. For example, consider
two unmodifiable lists containing mutable elements. The result of calling
might differ from one call to the next if
the elements had been mutated, even though both lists are unmodifiable.
However, if an unmodifiable collection contains all immutable elements,
it can be considered effectively immutable.
JRE Installation Instructions for Windows
When installing JRE on Windows computers, you must select the JRE installer that is appropriate for your Windows system.
The 64-bit Windows operating systems come with a 64-bit Internet Explorer (IE) browser as the standard (default) for viewing web pages.
Install JRE on Windows computers by performing the actions described in the following topics:
JRE Proxy Settings and Authentication
To use the Windows Online Installer, you must be connected to the internet.
If you are running behind a proxy server, then you must have your proxy settings correctly configured. If they are not configured, or are incorrectly configured, then the installer will terminate with the following message:
The installer cannot proceed with the current Internet Connection settings. Please visit the following website for more information.
If you see this message, check your proxy settings:
In the Control Panel , double-click Internet Options, select the Connections tab, and click the LAN Settings.
If you do not know what the correct settings should be, check with your internet provider or system administrator.
Downloading the JRE Installer
The JRE Installer is located on the Java SE Runtime Environment 9 Downloads page.
-
In a browser, go to the Java SE Runtime Environment 9 Downloads page.
The following JRE installers are available for you to download:
-
Windows Offline:
-
Windows:
-
-
Download the JRE installer according to your requirement.
Note:
The Windows Offline installer and Windows installer contains everything that is required to install the JRE.
The Microsoft Windows Installer (MSI) Enterprise JRE Installer is also available, which enables you to install the JRE across your enterprise. It requires a commercial license for use in production.
- Click Accept License Agreement, and then, under the Download menu, click the link that corresponds to the installer for your version of Windows.
- Note the file size specified on the download page and, after the download has completed, verify that you have downloaded the complete file.
Библиотеки
Есть одно изменение, которое я считаю очень полезным. Также есть и ряд второстепенных.
teeing collector
В Streams API, как обычно, появился новый Collector, предоставляемый служебным классом Collectors. Новый коллектор можно получить с помощью метода . teeing-коллектор принимает три аргумента: два коллектора и бифункцию. Для понимания работы этого коллектора рекомендую эту статью на Хабре.
Чтобы понять, как он это делает, я нарисовал диаграмму:
Все значения из входного потока передаются в каждый коллектор. Результат каждого коллектора передается в качестве аргументов в BiFunction для и генерации окончательного результата.
Простым примером является вычисление среднего значения (да, я знаю, что уже есть коллекторы для этого, например , но это простой пример, чтобы помочь понять концепцию).
Первый коллектор вычисляет сумму входного потока, а второй — количество элементов. BiFunction делит сумму на количество элементов, чтобы получить среднее значение.
java.io
— пропускает и отбрасывает ровно n байтов с входного потока InputStream. Если n равно нулю или меньше, байты не пропускаются.
java.lang
Появился новый пакет, java.lang.constant, который является частью API constant JVM, JEP 334.
Каждый файл класса Java имеет постоянный пул, в котором хранятся операнды для инструкций байт-кода в классе. Разработчикам сложно манипулировать файлами классов из-за проблем с загрузкой классов. API constant JVM предоставляет символические ссылочные типы для описания каждой формы константы (класса, загружаемой константы, , константы, константы).
Это также повлияло на несколько других классов. У всех следующих классов теперь есть метод:
- Class
- Double
- Enum
- Float
- Integer
- Long
- String
- MethodHandle
- MethodType
- VarHandle
Как британец, я нахожу это довольно забавным. Термин «Констебль»(Constable, ) используется с 11-го века, и именно так мы часто обращаемся к полицейским. Это также имя известного художника 18-го века, Джона Констебла. Это заставляет меня задуматься, будет ли в будущей версии метод . Очевидно, что в данном случае это сокращение , не относящееся к сотруднику закона или пейзажисту.
Следующие классы теперь включают метод :
- Double
- Enum.EnumDesc
- Float
- Integer
- Long
- String
java.lang.Character
Внутренние классы были обновлены, чтобы включить новые блоки Unicode. Мне всегда нравится видеть то, что нашли люди чтобы добавить в Unicode, вот несколько примеров:
- Шахматные символы
- Цифры майя
- Согдийский — восточный иранский язык, который перестал использоваться в 11-ом веке.
- Старый согдийский — более старый (и, я подозреваю, еще более ограниченный) вариант согдийского
java.lang.Class
возвращает для типа массива, тип компонента которого описывается этим . Это можно проверить используя :
Я не совсем уверен, в чем смысл этого метода, так как все, что он делает — это добавляет к тому типу, который представляет этот класс.
, такой же, как и . Напрашивается вопрос — зачем добавлять избыточный метод?
— опять же, возвращает тот же результат, что и . Однако он необходим, поскольку теперь реализует интерфейс, связанный с новым API constant JVM.
lava.lang.String
— добавляет ряд начальных пробелов в строку. Если параметр отрицателен, то это количество начальных пробелов будет удалено(если это возможно).
— Применяет предоставленную функцию к строке. Результат может не быть строкой.
java.lang.invoke
У теперь есть для возврата компактного описания.
У и у есть новый метод, который возвращает , содержащий , используемый в соединении.
java.nio.files
У класса есть новый метод, , который находит и возвращает позицию первого несовпадающего байта в содержимом двух файлов или -1L, если нет несоответствия.
java.text
Есть новый класс . Это подкласс , который форматирует десятичное число в компактной форме. Примером компактной формы — вместо , таким образом — требует два вместо девяти символов. и были расширены, чтобы включить новый метод . Существует также новый enum, который имеет два значения: LONG и SHORT.
java.util.concurrent
CompletionStage теперь включает несколько перегруженных форм с тремя методами:
- exceptionallyAsync
- exceptionallyCompose
- exceptionallyComposeAsync
Эти методы расширяют возможности создания нового из существующего, если текущий завершается исключением. Проверьте документацию API для деталей.
javax.naming.ldap.spi
Это новый пакет в JDK 12 и он содержит два класса — , который является классом поставщика услуг для поиска DNS при выполнении операций LDAP, и который инкапсулирует результат поиска DNS для URL-адреса LDAP.
Swing
Swing все еще обновляется! Да, теперь имеет новый метод . Он возвращает массив файлов, представляющих значения для отображения по умолчанию на панели ярлыков выбора файлов.
В чем разница между версиями Java?
Должен ли я изучать конкретную?
Придя из других языков программирования с большими перерывами между выпусками, как, например, Python 2–3, вы можете спросить, применимо ли это к Java.
Java особенная в этом отношении, поскольку она чрезвычайно обратно совместима. Это означает, что ваша программа на Java 5 или 8 гарантированно будет работать с виртуальной машиной Java 8-14 — с некоторыми исключениями, о которых вам сейчас не нужно беспокоиться.
Очевидно, что это не работает наоборот, скажем, ваша программа использует функции Java 14, которые просто недоступны в Java 8 JVM.
Это означает несколько вещей:
- Вы не просто «изучаете» конкретную версию Java, например Java 12.
- Скорее, вам нужно получить хорошую основу для всех языковых возможностей вплоть до Java 8.
- И затем, из этого руководства вы можете узнать, какие дополнительные функции появились в Java 9-14, чтобы использовать их всегда, когда это возможно.
Каковы примеры этих новых возможностей новых версий Java?
Взгляните на раздел «Возможности Java 8-14» ниже.
Но, как правило: старые, более длинные циклы выпуска (3-5 лет, вплоть до Java 8) означали множество новых функций в каждом выпуске.
Шестимесячный цикл выпуска означает меньшее количество функций на выпуск, поэтому вы можете быстро освоить языковые функции Java 9-14.
В чем разница между JRE и JDK?
До сих пор мы говорили только о Java. Но что именно означает «Java»?
Во-первых, вам нужно провести различие между JRE (Java Runtime Environment) и JDK (Java Development Kit).
Исторически, вы загружали только JRE, если вас интересовали только программы Java. JRE включает, помимо прочего, виртуальную машину Java (JVM) и инструмент командной строки «java».
Для разработки новых программ на Java вам нужно было загрузить JDK. JDK включает в себя все, что есть в JRE, а также компилятор javac и несколько других инструментов, таких как javadoc (генератор документации Java) и jdb (отладчик Java).
Теперь, почему я говорю в прошедшем времени?
Вплоть до Java 8 веб-сайт Oracle предлагал JRE и JDK в качестве отдельных загрузок, хотя JDK также всегда включал JRE в отдельной папке. В Java 9 это различие практически исчезло, и вы всегда загружаете JDK. Структура каталогов JDK также изменилась, так как в ней больше не было явной папки JRE.
Таким образом, хотя некоторые дистрибутивы (см. Раздел «Дистрибутивы Java») по-прежнему предлагают отдельную загрузку JRE, похоже, существует тенденция предлагать только JDK. Следовательно, теперь мы будем использовать Java и JDK взаимозаменяемо.
Как мне установить Java или JDK?
На данный момент не обращайте внимания на образы Java-Docker, оболочки MSI или пакеты для конкретной платформы. В конце концов, Java — это просто файл .zip; ни больше ни меньше.
Поэтому все, что вам нужно сделать, чтобы установить Java на свой компьютер, — это разархивировать файл jdk-{5-14}.zip. Вам даже не нужны права администратора для этого.
Ваш распакованный файл Java будет выглядеть так:
Магия происходит в каталоге /bin, который в Windows выглядит следующим образом:
Поэтому все, что вам нужно сделать, это разархивировать этот файл и поместить каталог /bin в переменную PATH, чтобы вы могли вызывать команду java из любого места.
В случае, если вам интересно, установщики с графическим интерфейсом, такие как Oracle или AdoptOpenJDK, выполняет распаковку и изменение переменной PATH вместо вас.
Чтобы убедиться, что вы правильно установили Java, вы можете просто выполнить команду java -version. Если вывод выглядит так, как показано ниже, вы готовы!
Теперь остался один вопрос: откуда вам взять этот .zip файл с Java? Что подводит нас к теме дистрибутивов.
Low-level stream construction
The class has a number of
low-level methods for creating a stream, all using some form of a
. A spliterator is the parallel analogue of an
; it describes a (possibly infinite) collection of
elements, with support for sequentially advancing, bulk traversal, and
splitting off some portion of the input into another spliterator which can
be processed in parallel. At the lowest level, all streams are driven by a
spliterator.
There are a number of implementation choices in implementing a
spliterator, nearly all of which are tradeoffs between simplicity of
implementation and runtime performance of streams using that spliterator.
The simplest, but least performant, way to create a spliterator is to
create one from an iterator using
.
While such a spliterator will work, it will likely offer poor parallel
performance, since we have lost sizing information (how big is the
underlying data set), as well as being constrained to a simplistic
splitting algorithm.
A higher-quality spliterator will provide balanced and known-size
splits, accurate sizing information, and a number of other
of the
spliterator or data that can be used by implementations to optimize
execution.
Spliterators for mutable data sources have an additional challenge;
timing of binding to the data, since the data could change between the time
the spliterator is created and the time the stream pipeline is executed.
Ideally, a spliterator for a stream would report a characteristic of
or ; if not it should be
. If a source
cannot directly supply a recommended spliterator, it may indirectly supply
a spliterator using a , and construct a stream via the
-accepting versions of
.
The spliterator is obtained from the supplier only after the terminal
operation of the stream pipeline commences.
These requirements significantly reduce the scope of potential
interference between mutations of the stream source and execution of stream
pipelines. Streams based on spliterators with the desired characteristics,
or those using the Supplier-based factory forms, are immune to
modifications of the data source prior to commencement of the terminal
operation (provided the behavioral parameters to the stream operations meet
the required criteria for non-interference and statelessness). See
for more details.