일상적인 개발 작업에서 우리는 객체 컬렉션에서 객체의 속성 컬렉션을 얻는 등 List의 데이터를 처리하는 문제에 자주 직면합니다. 이전에 우리가 생각한 것은 각 요소를 탐색한 다음 이를 꺼내서 다른 컬렉션에 넣는 것이었습니다. 이는 더 번거롭습니다. Java 8 이후에는 컬렉션에서 스트림 작업을 수행할 수 있으므로 위의 처리가 더욱 간결해집니다.
Stream 스트리밍 처리에는 map() 메소드가 있습니다. 먼저 그 정의를 살펴보겠습니다. 이 메소드는 java.util.stream.Stream 클래스에 있습니다.
맵을 보면 알 수 있습니다. () 메소드는 함수 표현식 인터페이스 매개변수를 수신하고, 입력 매개변수는 T를 가지며, 스트림 스트림은 R 일반입니다. 주로 다음 사항에 유의해야 합니다.
입력 매개변수는 스트림의 요소입니다.
출력 매개변수는 스트림이고 스트림은 새 요소입니다. 원본 스트림에는 4개의 원형 패턴이 있습니다. map() 함수를 호출하면 4개의 다섯개 별 패턴이 됩니다. 원형 패턴과 여기의 다섯개 별 패턴은 일대일 대응입니다. 즉, 원래 스트림에 요소가 몇 개 있는지를 나타냅니다. 호출 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의 중복 제거 기능을 사용할 수 있습니다.
//将学生姓名放到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); } }
위 결과를 보면 Tang Lin의 중국어 점수가 실제로 90
으로 변경된 것을 알 수 있는데, 이는 정확합니다. 원본 데이터를 보면 역시 90
으로 변경된 것을 알 수 있는데, 위에서 언급한 것처럼 map() 메소드는 새로운 스트림을 생성하는데, 원본 스트림의 데이터도 다음과 같은 이유로 수정되었습니다. 코드 줄이 원본에 있음 참조 유형의 데이터가 스트림의 요소에 따라 수정되면 원본 스트림의 데이터도 수정됩니다.
위 내용은 Java8 StreamAPI에서 map() 메소드를 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!