«1. Введение
В этом кратком руководстве мы рассмотрим все возможности преобразования IntStream в другие типы.
В качестве дополнения к этому руководству рекомендуется прочитать интересные материалы о упаковке, распаковке или итерации.
2. IntStream в массив
Давайте начнем изучать, как мы можем преобразовать объект IntStream в массив целых чисел.
Ради этого примера сгенерируем первые 50 четных чисел и в результате сохраним их в массиве:
@Test
public void intStreamToArray() {
int[] first50EvenNumbers = IntStream.iterate(0, i -> i + 2)
.limit(50)
.toArray();
assertThat(first50EvenNumbers).hasSize(50);
assertThat(first50EvenNumbers[2]).isEqualTo(4);
}
Во-первых, давайте создадим бесконечный поток целых чисел, начиная с 0 и итерируя, добавляя 2 к каждому элементу. Сразу после этого нам нужно добавить лимит промежуточной операции, чтобы эта операция хоть как-то завершалась.
Наконец, давайте воспользуемся завершающей операцией collect, чтобы собрать этот Stream в массив.
Это прямой способ создания массива целых чисел.
3. IntStream в список
Давайте теперь преобразуем IntStream в список целых чисел.
В этом случае, просто чтобы разнообразить пример, давайте воспользуемся методом range вместо метода iterate. Этот метод будет генерировать IntStream от int 0 до int 50 (не включен, так как это открытый диапазон):
@Test
public void intStreamToList() {
List<Integer> first50IntegerNumbers = IntStream.range(0, 50)
.boxed()
.collect(Collectors.toList());
assertThat(first50IntegerNumbers).hasSize(50);
assertThat(first50IntegerNumbers.get(2)).isEqualTo(2);
}
В этом примере мы используем метод range. Самая известная часть здесь — это использование метода boxed, который, как следует из его названия, упаковывает все элементы int в IntStream и возвращает Stream\u003cInteger\u003e.
Наконец, мы можем использовать коллектор для получения списка целых чисел.
4. IntStream в String
В нашей последней теме давайте рассмотрим, как мы можем получить String из IntStream.
В этом случае мы сгенерируем только первые 3 целых числа (0, 1 и 2):
@Test
public void intStreamToString() {
String first3numbers = IntStream.of(0, 1, 2)
.mapToObj(String::valueOf)
.collect(Collectors.joining(", ", "[", "]"));
assertThat(first3numbers).isEqualTo("[0, 1, 2]");
}
Сначала в этом случае мы создадим IntStream с помощью конструктора IntStream.of(). Получив Stream, нам нужно каким-то образом сгенерировать Stream\u003cString\u003e из IntStream. Следовательно, мы можем использовать промежуточный метод mapToObj, который примет IntStream и вернет Stream типа результирующего объекта, отображаемого в вызываемом методе.
Наконец, мы используем объединение коллекторов, которое принимает Stream\u003cString\u003e и может добавлять каждый элемент Stream с помощью разделителя и, при необходимости, префикса и суффикса.
5. Выводы
В этом кратком руководстве мы рассмотрели все альтернативы, когда нам нужно преобразовать IntStream в любой другой тип. В частности, мы рассмотрели примеры создания массива, списка и строки.
И, как всегда, пример кода доступен на GitHub.