Home > Java > javaTutorial > body text

How to use the map() method in Java8 StreamAPI

王林
Release: 2023-05-13 19:16:04
forward
1493 people have browsed it

Preface

In daily development work, we often encounter the problem of processing data in a List, such as obtaining a collection of attributes in an object from a collection of objects. What we thought before was to traverse each element and then take it out and put it into another collection, which is more cumbersome; after Java 8, Stream operations can be performed on collections, making the above processing more concise.

Overview

Stream There is a map() method in streaming processing. Let’s take a look at its definition first. This method is in the java.util.stream.Stream class

How to use the map() method in Java8 StreamAPI

You can see that the map() method receives a functional interface parameter. The input parameter has a T and returns a Stream. This stream is R generic. There are mainly the following points to note:

  • The input parameter is an element in a stream;

  • The output parameter is a stream, and the stream is New element;

is represented by a diagram as follows. There are four circular patterns in the original stream. After calling the map() function, it becomes four five-pointed star patterns. Here The circular pattern and the five-pointed star pattern have a one-to-one correspondence, that is, how many elements there are in the original stream, how many elements there are still after calling the map() method, the only thing that changes is the element type in the stream.

How to use the map() method in Java8 StreamAPI

Example

We first create an entity class Student.java

@Data
public class Student implements Serializable {
    /**
     * 姓名
     */
    private String name;
    /**
     * 班级
     */
    private String schoolClass;
    /**
     *语文成绩
     */
    private Integer chineseScore;
    /**
     * 数学成绩
     */
    private Integer mathScore;
}
Copy after login

and then create a class to initialize data:

public class DataFactory {
    public static List<Student> initData(){
        List<Student> list= new ArrayList<>();
        Student s1=new Student();
        s1.setName("汤霖");
        s1.setSchoolClass("小一班");
        s1.setChineseScore(87);
        s1.setMathScore(95);
        list.add(s1);
 
        Student s2=new Student();
        s2.setName("李牧唐");
        s2.setSchoolClass("小二班");
        s2.setChineseScore(98);
        s2.setMathScore(97);
        list.add(s2);
 
        Student s3=new Student();
        s3.setName("顾北辰");
        s3.setSchoolClass("二年级");
        s3.setChineseScore(89);
        s3.setMathScore(94);
        list.add(s3);
 
        Student s4=new Student();
        s4.setName("言言");
        s4.setSchoolClass("小二班");
        s4.setChineseScore(100);
        s4.setMathScore(90);
        list.add(s4);
 
        Student s5=new Student();
        s5.setName("大运");
        s5.setSchoolClass("小三班");
        s5.setChineseScore(96);
        s5.setMathScore(100);
        list.add(s5);
        return list;
    }
}
Copy after login

Find the names of all students

public static void main(String[] args) {
    DataFactory.initData().stream()
        .map(student -> student.getName())
        .forEach(System.out::println);
}
Copy after login

The map() method is used here. The input parameter is Student, the output parameter is a stream with String as a generic type, and finally forEach is used. After printing, look at the result

How to use the map() method in Java8 StreamAPI

and you can see that all the students’ names have just been printed out. What if you want to put these student names into a List?

Put the student names into the list

public static void main(String[] args) {
    //将所有的学生姓名放到list中
    List<String> studentNames = DataFactory.initData().stream()
        .map(student -> student.getName())
        .collect(Collectors.toList());
    for (String studentName : studentNames) {
        System.out.println(studentName);
    }
}
Copy after login

Similarly find all the classes and find out the scores of all students. You can compare it to the above and you can see the print There is duplicate data in the student names or classes. How to solve this problem? We know that the data is put into the List at the end. In order to solve the duplication problem, the data can be put into the Set and use the deduplication function of the Set:

//将学生姓名放到Set中,可以实现去重功能
Set<String> studentNames = DataFactory.initData().stream()
    .map(student -> student.getName())
    .collect(Collectors.toSet());
Copy after login

The result will no longer be printed. If you are interested, you can try it yourself. try.

Set the Chinese score of the student named "Tang Lin" to 90

Now there is a need to set the Chinese score of the student named Tang Lin to90, let’s see how to use the map() function?

public static void main(String[] args) {
    List<Student> students = DataFactory.initData();

    List<Student> studentNames = students.stream().map(student -> {
        if ("汤霖".equals(student.getName())) {
            student.setChineseScore(90);
        }
        return student;
    }).collect(Collectors.toList());

    for (Student studentName : studentNames) {
        System.out.println(studentName);
    }
    //打印老的list
    System.out.println("-----改之前的数据-----");
    for (Student studentName : students) {
        System.out.println(studentName);
    }
}
Copy after login

Output result:

How to use the map() method in Java8 StreamAPI

##It can be seen from the above results that Tang Lin’s Chinese score has indeed been changed to

90 , this is correct. Looking at the original data, it has also been changed to 90. As mentioned above, the map() method generates a new stream, and the data in the original stream has also been modified, because the following line of code is in the original stream. The data in the reference type is modified on the basis of the elements in the element, resulting in the data in the original stream also being modified.

The above is the detailed content of How to use the map() method in Java8 StreamAPI. For more information, please follow other related articles on the PHP Chinese website!

Related labels:
source:yisu.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template