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.
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
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.
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; }
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; } }
Find the names of all students
public static void main(String[] args) { DataFactory.initData().stream() .map(student -> student.getName()) .forEach(System.out::println); }
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
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); } }
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());
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); } }
Output result:
##It can be seen from the above results that Tang Lin’s Chinese score has indeed been changed to90 , 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!