0Pricing
Java Academy · Урок

Преобразование объектных потоков и обратно

mapToObj и mapToInt

«Преобразование объектных потоков и обратно» — бесплатный урок Java Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Java Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Java Academy содержит 4 уроков всего.

Два мира потоков

В Java есть потоки объектов (Stream<T>) и потоки примитивов (IntStream и аналогичные потоки). Методы преобразования позволяют переходить между ними.

import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        System.out.println(IntStream.rangeClosed(1, 3).sum());
    }
}

mapToObj: из примитива в объект

mapToObj преобразует каждый примитив в объект, создавая Stream<T>.

import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        List<String> labels = IntStream.rangeClosed(1, 3)
            .mapToObj(n -> "item-" + n)
            .collect(Collectors.toList());
        System.out.println(labels);
    }
}

mapToInt: из объекта в примитив

mapToInt извлекает int из каждого объекта, создавая IntStream, готовый к числовому агрегированию.

import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<String> words = List.of("hi", "hello", "hey");
        int totalChars = words.stream()
            .mapToInt(String::length)
            .sum();
        System.out.println(totalChars);
    }
}

boxed: из примитивов в поток оболочек

boxed превращает IntStream в Stream<Integer>, который необходим перед сбором в List.

import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        List<Integer> list = IntStream.rangeClosed(1, 5)
            .boxed()
            .collect(Collectors.toList());
        System.out.println(list);
    }
}

mapToLong и mapToDouble

Для других примитивных типов действует тот же принцип: mapToLong и mapToDouble.

import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<String> prices = List.of("9.99", "19.50", "4.25");
        double total = prices.stream()
            .mapToDouble(Double::parseDouble)
            .sum();
        System.out.println(total);
    }
}

Почему mapToInt лучше map

Использование map для потока объектов сохраняет упаковку. mapToInt открывает доступ к числовым методам, таким как sum и average, и одновременно избегает упаковки.

import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<Integer> nums = List.of(10, 20, 30);
        double avg = nums.stream()
            .mapToInt(Integer::intValue)
            .average()
            .getAsDouble();
        System.out.println(avg);
    }
}

Обратный путь: из объекта в Int и обратно в объект

Вы можете пройти оба направления в одном конвейере: извлечь числа, преобразовать их, а затем снова преобразовать в объекты.

import java.util.List;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        List<String> words = List.of("a", "bb", "ccc");
        List<String> report = words.stream()
            .mapToInt(String::length)
            .mapToObj(len -> "len=" + len)
            .collect(Collectors.toList());
        System.out.println(report);
    }
}

asLongStream и asDoubleStream

В потоках примитивов можно расширять типы: asLongStream и asDoubleStream меняют разрядность чисел без упаковки.

import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        double avg = IntStream.of(1, 2, 3, 4)
            .asDoubleStream()
            .average()
            .getAsDouble();
        System.out.println(avg);
    }
}

Сбор результатов-примитивов

Чтобы собрать примитивы в коллекцию, сначала вызовите boxed, а затем примените сборщик.

import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        Set<Integer> evens = IntStream.rangeClosed(1, 10)
            .filter(n -> n % 2 == 0)
            .boxed()
            .collect(Collectors.toSet());
        System.out.println(evens);
    }
}

flatMapToInt

flatMapToInt объединяет объекты в один IntStream; это удобно, когда каждый объект выдаёт несколько чисел.

import java.util.List;
import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        List<int[]> rows = List.of(new int[]{1, 2}, new int[]{3, 4});
        int sum = rows.stream()
            .flatMapToInt(Arrays::stream)
            .sum();
        System.out.println(sum);
    }
}

Выбор подходящего преобразователя

Выбирайте метод по направлению преобразования:

  • Из объекта в примитив: mapToInt, mapToLong, mapToDouble.
  • Из примитива в объект: mapToObj или boxed.
import java.util.List;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        List<String> in = List.of("x", "yy");
        String out = in.stream()
            .mapToInt(String::length)
            .mapToObj(Integer::toString)
            .collect(Collectors.joining(","));
        System.out.println(out);
    }
}

Быстрая проверка

Какой метод превращает IntStream в Stream<Integer>?

Повторение

Вы переходили между потоками объектов и примитивов:

  • mapToInt/mapToLong/mapToDouble преобразуют объекты в примитивы.
  • mapToObj и boxed преобразуют примитивы в объекты.
  • flatMapToInt объединяет множество чисел в один IntStream.
  • Переход к потокам примитивов открывает доступ к числовым агрегатам без упаковки.

Часто задаваемые вопросы

Урок «Преобразование объектных потоков и обратно» бесплатный?

Да — полный текст урока «Преобразование объектных потоков и обратно» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Java Academy, подпишись на CoddyKit PRO. Курс Java Academy содержит 4 уроков всего.

Чему я научусь в уроке «Преобразование объектных потоков и обратно»?

mapToObj и mapToInt Ты практикуешь Java Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Java Academy?

Предыдущий опыт не требуется. Java Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Преобразование объектных потоков и обратно»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Java Academy?

Да. Каждый урок Java Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. IntStream и LongStream
  2. Диапазоны и агрегирующие операции
  3. Преобразование объектных потоков и обратно
  4. Генерация примитивных потоков
← Назад к Java Academy