Рубрики
Без рубрики

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

Узнайте, как работать с целочисленными потоками с помощью API Java Stream.

Автор оригинала: Antonio Manuel Moreno Delgado.

1. введение

В этом кратком уроке мы рассмотрим все возможности, касающиеся Instream преобразования в другие типы .

Интересные чтения о боксе и распаковке или итерации рекомендуются в качестве дополнения к этому учебнику.

2. IntStream в массив

Давайте начнем изучать, как мы можем преобразовать из объекта Instream в массив int s .

Для этого примера давайте сгенерируем первые 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 к каждому элементу. Сразу после этого нам нужно добавить промежуточную операцию limit , чтобы эта операция каким-то образом завершилась.

Наконец, давайте используем завершающую операцию collect , чтобы собрать этот Поток в массив.

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

3. IntStream в список

Давайте теперь преобразуем an IntStream в Список целых чисел .

В этом случае, просто чтобы добавить больше разнообразия в пример, давайте использовать метод range вместо метода iterate . Этот метод будет генерировать IntStream от int 0 до int 50 (не входит, так как это открытый диапазон):

@Test
public void intStreamToList() {
  List first50IntegerNumbers = IntStream.range(0, 50)
    .boxed()
    .collect(Collectors.toList());

  assertThat(first50IntegerNumbers).hasSize(50);
  assertThat(first50IntegerNumbers.get(2)).isEqualTo(2);
}

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

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

4. IntStream в строку

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

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

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

5. Выводы

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

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