Использование метода Map в потоке Stream

Функция функции карты заключается в выполнении операций преобразования для каждого элемента данных в конвейерном потоке.

Есть три основных использования

1. Базовое использование карты потока конвейера Stream

Преобразуйте каждую строку в коллекции в верхний регистр!

не использовать поток

List<String> list = Arrays.asList("Monkey", "Lion", "Giraffe", "Lemur";
//不使用Stream管道流
List<String> listUpper = new ArrayList<>();
for (String s : list) {
    
    
    listUpper.add(s.toUpperCase());
}
System.out.println(listUpper); //[MONKEY, LION, GIRAFFE, LEMUR]                     

использовать поток

List<String> list = Arrays.asList("Monkey", "Lion", "Giraffe", "Lemur";
// 使用Stream管道流
List<String> collect = list.stream().map(String::toUpperCase).collect(Collectors.toList());
//上面使用了方法引用,和下面的lambda表达式语法效果是一样的
//List<String> collect = alpha.stream().map(s -> s.toUpperCase()).collect(Collectors.toList());

System.out.println(collect); //[MONKEY, LION, GIRAFFE, LEMUR]

2. Обработка элементов коллекции не строкового типа

Функция map() может не только обрабатывать данные, но и преобразовывать тип данных

List<String> list = Arrays.asList("Monkey", "Lion", "Giraffe", "Lemur";
List<Integer> lengths = list.stream()
        .map(String::length)
        .collect(Collectors.toList());

System.out.println(lengths); //[6, 4, 7, 5]

Stream.of("Monkey", "Lion", "Giraffe", "Lemur")
        .mapToInt(String::length)
        .forEach(System.out::println);

Результат выглядит следующим образом:

6
4
7
5

Кроме маптоинт. Есть также такие варианты использования, как maoToLong, mapToDouble и т. д.

3. Преобразование формата данных объекта обработки

Класс сотрудников, создайте 10 объектов.

Требования следующие:

Добавьте один год к возрасту каждого работника, замените «М» в поле на «мужской», а букву «Ж» замените на «женский».

public static void main(String[] args){
    
    
    Employee e1 = new Employee(1,23,"M","Rick","Beethovan");
    Employee e2 = new Employee(2,13,"F","Martina","Hengis");
    Employee e3 = new Employee(3,43,"M","Ricky","Martin");
    Employee e4 = new Employee(4,26,"M","Jon","Lowman");
    Employee e5 = new Employee(5,19,"F","Cristine","Maria");
    Employee e6 = new Employee(6,15,"M","David","Feezor");
    Employee e7 = new Employee(7,68,"F","Melissa","Roy");
    Employee e8 = new Employee(8,79,"M","Alex","Gussin");
    Employee e9 = new Employee(9,15,"F","Neetu","Singh");
    Employee e10 = new Employee(10,45,"M","Naveen","Jain");


    List<Employee> employees = Arrays.asList(e1, e2, e3, e4, e5, e6, e7, e8, e9, e10);

    /*List<Employee> maped = employees.stream()
            .map(e -> {
                e.setAge(e.getAge() + 1);
                e.setGender(e.getGender().equals("M")?"male":"female");
                return e;
            }).collect(Collectors.toList());*/

    List<Employee> maped = employees.stream()
            .peek(e -> {
    
    
                e.setAge(e.getAge() + 1);
                e.setGender(e.getGender().equals("M")?"male":"female");
            }).collect(Collectors.toList());

    System.out.println(maped);

}

Поскольку параметр e карты является возвращаемым значением, можно использовать функцию peek . Функция peek – это специальная функция карты. Функция peek может использоваться, когда функция не имеет возвращаемого значения или параметр является возвращаемым значением.

Четыре, квартираКарта

Map может выполнять операции преобразования данных в конвейерных потоках, но что, если в конвейере все еще есть конвейеры? То есть: как иметь дело с двумерными массивами и двумерными классами коллекций. Реализуйте простое требование: распечатайте набор из двух строк, состоящих из «hello» и «world», и каждой буквы элемента. Как мы можем писать без Stream? Напишите 2 слоя циклов for, первый слой проходит по строке и разбивает строку на массивы символов, а второй слой циклов for проходит по массиву символов.

List<String> words = Arrays.asList("hello", "word");
words.stream()
        .map(w -> Arrays.stream(w.split("")))    //[[h,e,l,l,o],[w,o,r,l,d]]
        .forEach(System.out::println);

Выходной результат печати:

java.util.stream.ReferencePipeline$Head@3551a94
java.util.stream.ReferencePipeline$Head@531be3c5

Использовать метод карты невозможно, и это требование не может быть реализовано методом карты. Map может работать только с одномерными массивами, есть массивы в массивах и конвейеры в конвейерах, она не может обрабатывать каждый элемент.

вставьте сюда описание изображения

flatMap можно понимать как плоское расширение всех данных в нескольких подконвейерах в родительский конвейер для обработки.

вставьте сюда описание изображения

words.stream()
        .flatMap(w -> Arrays.stream(w.split(""))) // [h,e,l,l,o,w,o,r,l,d]
        .forEach(System.out::println);

Выходной результат печати:

h
e
l
l
o
w
o
r
d

Ссылка на ссылку:

  1. Использование карты потока

Supongo que te gusta

Origin blog.csdn.net/qq_44113347/article/details/131380923
Recomendado
Clasificación