Перейти к основному содержимому

Преобразования Java IntStream

· 3 мин. чтения

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 в массив.

Это прямой способ создания массива int s .

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);
}

В этом примере мы используем диапазон метода . Самая известная часть здесь — использование метода boxed , который, как следует из его названия, упаковывает все элементы int в IntStream и возвращает Stream<Integer> .

Наконец, мы можем использовать сборщик для получения списка целых чисел s.

4. IntStream в строку

В нашей последней теме давайте рассмотрим, как мы можем получить String из IntStream .

В этом случае мы сгенерируем только первые 3 int (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<String> из IntStream . Следовательно, мы можем использовать промежуточный метод mapToObj , который примет IntStream и вернет Stream типа результирующего объекта, отображаемого в вызываемом методе.

Наконец, мы используем соединение сборщика , которое принимает Stream<String> и может добавлять каждый элемент Stream с помощью разделителя и, при необходимости, префикса и суффикса.

5. Выводы

В этом кратком руководстве мы рассмотрели все альтернативы, когда нам нужно преобразовать IntStream в любой другой тип. В частности, мы рассмотрели примеры создания массива, списка и строки .

И, как всегда, пример кода доступен на GitHub .