> Java > java지도 시간 > Java8 StreamAPI에서 map() 메소드를 사용하는 방법

Java8 StreamAPI에서 map() 메소드를 사용하는 방법

王林
풀어 주다: 2023-05-13 19:16:04
앞으로
1504명이 탐색했습니다.

머리말

일상적인 개발 작업에서 우리는 객체 컬렉션에서 객체의 속성 컬렉션을 얻는 등 List의 데이터를 처리하는 문제에 자주 직면합니다. 이전에 우리가 생각한 것은 각 요소를 탐색한 다음 이를 꺼내서 다른 컬렉션에 넣는 것이었습니다. 이는 더 번거롭습니다. Java 8 이후에는 컬렉션에서 스트림 작업을 수행할 수 있으므로 위의 처리가 더욱 간결해집니다.

Overview

Stream 스트리밍 처리에는 map() 메소드가 있습니다. 먼저 그 정의를 살펴보겠습니다. 이 메소드는 java.util.stream.Stream 클래스에 있습니다.

Java8 StreamAPI에서 map() 메소드를 사용하는 방법

맵을 보면 알 수 있습니다. () 메소드는 함수 표현식 인터페이스 매개변수를 수신하고, 입력 매개변수는 T를 가지며, 스트림 스트림은 R 일반입니다. 주로 다음 사항에 유의해야 합니다.

  • 입력 매개변수는 스트림의 요소입니다.

  • 출력 매개변수는 스트림이고 스트림은 새 요소입니다. 원본 스트림에는 4개의 원형 패턴이 있습니다. map() 함수를 호출하면 4개의 다섯개 별 패턴이 됩니다. 원형 패턴과 여기의 다섯개 별 패턴은 일대일 대응입니다. 즉, 원래 스트림에 요소가 몇 개 있는지를 나타냅니다. 호출 map() 메서드 뒤에도 여전히 많은 요소가 있습니다. 변경되는 유일한 것은 스트림의 요소 유형입니다.

Java8 StreamAPI에서 map() 메소드를 사용하는 방법먼저 엔터티 클래스 Student.java를 생성합니다

@Data
public class Student implements Serializable {
    /**
     * 姓名
     */
    private String name;
    /**
     * 班级
     */
    private String schoolClass;
    /**
     *语文成绩
     */
    private Integer chineseScore;
    /**
     * 数学成绩
     */
    private Integer mathScore;
}
로그인 후 복사

그런 다음 데이터를 초기화하는 클래스를 생성합니다.

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;
    }
}
로그인 후 복사

모든 학생 이름을 알아냅니다

public static void main(String[] args) {
    DataFactory.initData().stream()
        .map(student -> student.getName())
        .forEach(System.out::println);
}
로그인 후 복사

여기서는 map() 메소드가 사용됩니다 , 입력 매개변수는 Student이고, 출력 매개변수는 String을 제네릭 타입으로 한 스트림입니다. 마지막으로 forEach를 사용하여 출력한 결과를 보면 모든 학생의 이름이 출력된 것을 알 수 있습니다. 이러한 학생 이름을 목록에 추가하려면 어떻게 해야 합니까?

목록에 학생 이름을 넣어보세요

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);
    }
}
로그인 후 복사

마찬가지로 모든 수업을 찾아 전체 학생의 점수를 알아내면 위와 같이 출력된 학생 이름이나 수업에 중복된 데이터가 있는 것을 확인할 수 있습니다. 해결 방법. 우리는 데이터가 마지막에 List에 저장된다는 것을 알고 있습니다. 중복 문제를 해결하기 위해 데이터를 Set에 넣고 Set의 중복 제거 기능을 사용할 수 있습니다. Java8 StreamAPI에서 map() 메소드를 사용하는 방법

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

결과는 더 이상 인쇄되지 않습니다. 관심이 있으시면 직접 시도해 볼 수 있습니다.

Tang Lin이라는 학생의 중국어 점수를 90으로 설정

이제 Tang Lin이라는 학생의 중국어 점수를 90으로 설정해야 합니다. 사용법 map() 함수는 어떻게 하나요?

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);
    }
}
로그인 후 복사
출력 결과:

Java8에서 map() 메소드를 사용하는 방법 StreamAPI

위 결과를 보면 Tang Lin의 중국어 점수가 실제로 90으로 변경된 것을 알 수 있는데, 이는 정확합니다. 원본 데이터를 보면 역시 90으로 변경된 것을 알 수 있는데, 위에서 언급한 것처럼 map() 메소드는 새로운 스트림을 생성하는데, 원본 스트림의 데이터도 다음과 같은 이유로 수정되었습니다. 코드 줄이 원본에 있음 참조 유형의 데이터가 스트림의 요소에 따라 수정되면 원본 스트림의 데이터도 수정됩니다.

위 내용은 Java8 StreamAPI에서 map() 메소드를 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:yisu.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿