«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.