본문 바로가기

Java

Stream API

 

Stream API forEach()

 

public class StudentDTO {
    String name;
    int age;
    int scoreMath;
    int scoreEnglish;
 
    public StudentDTO(String name, int age, int scoreMath, int scoreEnglish) {
        this.name = name;
        this.age = age;
        this.scoreMath = scoreMath;
        this.scoreEnglish = scoreEnglish;
 
    //이하 각 변수의 getter, setter선언 생략
 
    }
}
 
cs
public class StudentForEachSample {
    public static void main(String[] args) {
        StudentForEachSample sample = new StudentForEachSample();
        List<StudentDTO> studentList = new ArrayList<>();
 
        studentList.add(new StudentDTO("준서"189910));
        studentList.add(new StudentDTO("예지"177185));
        studentList.add(new StudentDTO("도윤"198175));
 
        sample.printStudentNames(studentList);
    }
 
    public void printStudentNames(List<StudentDTO> students) {
        
        for (StudentDTO student : students) {
            System.out.println(student.getName());
        }
    }
}
 
cs

 

학생들의 정보를 갖는 DTO클래스, DTO클래스에 값을 넣고 출력하는 메인메소드 클래스이다.

StudentDTO타입의 List객체를 생성해서 값들을 추가하고 

출력할때는 기존에 쓰던 방식인 (enhanced)for문을 돌려서 하나씩 처리했다.

컬렉션객체, 배열처럼 연속된 데이터 처리는 이렇게 for문을 돌릴수도 있지만

더욱 간단하고 정형화된 Stream API를 통해서 작성가능하다.

(배열은 그자체로는 Stream을 사용할수 없지만 asList()와 같은 메소드로 변환해서 사용가능함)

 

for (StudentDTO student : students) {
    System.out.println(student.getName());
}

students.stream().forEach(student -> System.out.println(student.getName()));

이렇게 바꿀수 있다.

 

 

Stream API map()

 

public class StreamMap {
    public static void main(String[] args) {
        List<Integer> intList = Arrays.asList(12345678910);
 
        StreamMap sm = new StreamMap();
        sm.multiplyWithFor(intList);
    }
 
    private void multiplyWithFor(List<Integer> intList) {
        for (Integer value : intList) {
            int result = value * 3;
            System.out.println(result);
        }
    }
}
 
cs

 

1부터 10까지의 값을 갖는 intList객체에서 각 요소의 3배수를 출력하는 구문이다.

고전적인 for문을 stream으로 치환해보면

intList.stream().forEach(value -> System.out.println(value * 3));

이런식으로 표현가능하다.

여기서 람다식의 파라미터인 value부분과 실행부인 value * 3 부분을 통일시키면

메소드참조를 사용해서 더 간결하게 작성할수 있다.

intList.stream().map(x -> x*3).forEach(System.out::println);

이럴때 map()을 사용해서 스트림 값 자체를 변환할수 있고 forEach부분은 메소드참조를 적용가능하다.

map()은 단순히 숫자변경뿐만 아니라 객체도 변경이 가능하다.

 

students.stream().forEach(student -> System.out.println(student.getName()));

forEach 예시의 stream구문에서 람다식부분을 메소드참조방식으로 변경하려한다.

실제 구현은 student.getName()값을 사용하게 되므로

파라미터인 student를 map()을 사용해 student.getName으로 변경을 해준다.

students.stream().map(student -> student.getName()).forEach(System.out::println);

더 짧게 작성하고 싶다면 map의 람다부분도 메소드참조로 변환할수 있다.

students.stream().map(StudentDTO::getName).forEach(System.out::println);

 

 

Stream API filter()

 

stream식을 사용할때 특정값만 선택적으로 처리가능하다.

 

public class StudentFilterSample {
    public static void main(String[] args) {
        StudentFilterSample sample = new StudentFilterSample();
        List<StudentDTO> studentList = new ArrayList<>();
 
        studentList.add(new StudentDTO("준서"189910));
        studentList.add(new StudentDTO("예지"177185));
        studentList.add(new StudentDTO("도윤"198175));
 
        sample.filterWithScoreForLoop(studentList, 80);
    }
 
    public void filterWithScoreForLoop(List<StudentDTO> studentList, int scoreCutline) {
        for (StudentDTO student : studentList) {
            if (student.getScoreMath() > scoreCutline) {
                System.out.println(student.getName());
            }
        }
    }
}
 
cs

 

forEach예제에서 모든 학생의 모든 학생의 이름이 아닌 수학점수가 80점 이상이라는 조건을 추가했다.

이런 조건추가는 for방식에선 if로 구현가능하지만 stream식에서는 filter()를 사용할수 있다.

 

studentList.stream()
        .filter(student -> student.getScoreMath() > scoreCutline)
        .forEach(student -> System.out.println(student.getName()));

map을 활용해 메소드참조 방식으로 추가 가공도 가능하다.

studentList.stream()
        .filter(student -> student.getScoreMath() > scoreCutline)
        .map(StudentDTO::getName)
        .forEach(System.out::println);

'Java' 카테고리의 다른 글

익명클래스와 람다식  (0) 2022.03.01
Optional 클래스  (0) 2022.02.28
테스트 범위와 종류  (0) 2022.02.22
테스트케이스의 대역  (0) 2022.02.21
TDD방법론 - 암호검사기4(WEAK CASE)  (0) 2022.02.13