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 .