Преобразование объектных потоков и обратно
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 — локальная установка не требуется.
Все уроки этого курса
- IntStream и LongStream
- Диапазоны и агрегирующие операции
- Преобразование объектных потоков и обратно
- Генерация примитивных потоков