Java 8 Stream map()
Данная статья написана командой Vertex Academy. Это одна из статей из нашего Учебника по Java 8. Надеемся, что данная статья Вам будет полезна. Приятного прочтения!
В этой статье мы рассмотрим преобразование данных с помощью Stream-ов в Java.
1. Введение
Stream API - новый способ взаимодействия с данными, представляя их в виде конечного потока данных.
Один из методов Stream-ов, map принимает лямбда-выражение известное как функция (Function), которое преобразовывает Stream одного типа данных в Stream другого типа.
С ними мы сегодня и научимся работать.
2. Multiply integers
Выведем список чисел, умноженных на 2
До Java 8
1 2 3 4 5 6 7 |
public static void main(String[] args) { List<Integer> numbers = Arrays.asList(1, 3, 5, 7); for (Integer i : numbers) { System.out.println(i * 2); //output 2 6 10 14 } } |
Теперь мы можем использовать метод map() в Stream API, а так же метод forEach и ссылку на метод
1 2 3 4 5 6 7 |
public static void main(String[] args) { List<Integer> numbers = Arrays.asList(1, 3, 5, 7); numbers.stream() .map(i -> i * 2) .forEach(System.out::println); //output 2 6 10 14 } |
В данном случае мы преобразовали Stream чисел в Stream чисел, умноженных на два, после чего вывели их на экран
3. Capitalize Strings with Stream map()
Выведем список имен, но с первой заглавной буквой
До Java 8
1 2 3 4 5 6 7 8 9 |
public static void main(String[] args) { List<String> names = Arrays.asList("john", "arya", "sansa"); for (String s : names) { char[] chars = s.toCharArray(); chars[0] = Character.toUpperCase(chars[0]); System.out.println(new String(chars)); //output John Arya Sansa } } |
И это без проверок на null и пустую строку
В Java 8 мы можем воспользоваться методом map и новым утилитным классом StringUtils
1 2 3 4 5 6 7 |
public static void main(String[] args) { List<String> names = Arrays.asList("john", "arya", "sansa"); names.stream() .map(StringUtils::capitalize) .forEach(System.out::println); //output John Arya Sansa } |
Что значительно упрощает задачу
4. Objects to Strings
Создадим класс Car
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
class Car { private String number; private int year; public Car(String number, int year) { this.number = number; this.year = year; } public String getNumber() { return number; } public int getYear() { return year; } } |
Предположим, нужно вывести все номера машин
До Java 8
1 2 3 4 5 6 7 8 9 10 11 12 |
public static void main(String[] args) { List<Car> cars = Arrays.asList( new Car("AA1111BX", 2007), new Car("AM1111BE", 2009), new Car("AK5555IT", 2010), new Car("AI5601CC", 2015), new Car("AI3838PP", 2017)); for (Car car : cars) { System.out.println(car.getNumber()); } } |
Сейчас
1 2 3 4 5 6 7 8 9 10 11 12 |
public static void main(String[] args) { List<Car> cars = Arrays.asList( new Car("AA1111BX", 2007), new Car("AM1111BE", 2009), new Car("AK5555IT", 2010), new Car("AI5601CC", 2015), new Car("AI3838PP", 2017)); cars.stream() .map(Car::getNumber) // преобразовываем Stream машин в Stream номеров .forEach(System.out::println); } |
Вывод
1 2 3 4 5 |
AA1111BX AM1111BE AK5555IT AI5601CC AI3838PP |
5. Stream filter + map()
Усложним предыдущую задачу, теперь нужно вывести все не пустые номера машин, выпущенных после 2010 года
До Java 8
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public static void main(String[] args) { List<Car> cars = Arrays.asList( new Car("AA1111BX", 2007), new Car("AK5555IT", 2010), new Car(null, 2012), new Car("", 2015), new Car("AI3838PP", 2017)); for (Car car : cars) { if (car.getYear() > 2010) { String number = car.getNumber(); if (number != null && !number.isEmpty()) System.out.println(number); } } } |
Сейчас мы можем объеденить методы filter и map()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public static void main(String[] args) { List<Car> cars = Arrays.asList( new Car("AA1111BX", 2007), new Car("AK5555IT", 2010), new Car(null, 2012), new Car("", 2015), new Car("AI3838PP", 2017)); cars.stream() .filter(c -> c.getYear() > 2010) // выбираем только машины, выпущенные после 2010 года .map(Car::getNumber) // преобразовываем Машины в номера, теперь у нас Stream номеров машин .filter(s -> s != null && !s.isEmpty()) // выбираем только не пустые номера .forEach(System.out::println); // выводим результат } |
Вывод
1 |
AI3838PP |
Надеемся, что наша статья была Вам полезна. Также есть возможность записаться на наши курсы по Java в Киеве. Детальнее - у нас на сайте.