Автор оригинала: 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() { Listfirst50IntegerNumbers = 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 .