JAVA

Stream.filter()을 이용해 하나의 원소만 리턴받기

Ambitions 2021. 1. 26. 15:51

오늘은 stream클래스의 filter 메소드를 사용하고 있던중, 필터링 되어 리턴되는 결과값이 한 개만 되도록 하고싶을떄 사용할 수 있는 방법을 정리하려고 한다. 본 내용은 글로써 서술하는 것보다 코드를 보며 정리하는게 좋을것같아 바로 코드를 보려고한다. 코드는 다음과같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/* 
    Member이라는 테이블(Entity)가 존재하고 모든 Member의 리스트중에서 
    유니크한 값을 이용해 필터링하는 상황을 가정
    class 중략..
*/  
 
public testMethod(Long id) {
 
    List<Member> members = memberRepo.findAll();
    Member resultMember = new Member();
    // 가장간단히 생각할 수 있는방법(for문 이용한 방법) 
    for(Member member : members) { 
        if(member.getId() == id) {
            resultMember = member;
            break;
        }
    }
    
    //Stream class의 filter메소드를 이용
    List<Members> result = members.stream().filter(a -> a.getId() == id).collect(Collectors.toList());
    /* 사실 결과값이 한 개만 리턴되는게 확실하면 아래처럼 써도되겠지만 
        아래와 같은 하드코딩을 허용하는 경우는 실제로 없을것이다.
    */
    System.out.println(result[0]);
    // 결과값을 리스트말고 Optional로 받고싶다면? 아래와 같이 사용하면 된다.
    Member oneMember = members.stream().filter(Member::getId).findFirst().get(); 
    // 리스트 중 id가 같은 멤버가 출력
    System.out.println(oneMember) ;
 
}
cs

 

 

 

여기서 중요한건 findFirst메소드는 필터링 조건에 맞는 첫 번쨰 원소를 리턴한다는 것이다. 그러니까 저 메소드의 경우는 리턴되는 값이 하나일때만 사용하는것이 좋을것같고, 또 조건에 맞는 원소를 찾지 못하면 비어있는 Optional을 리턴하기 때문에 위 코드에는 작성되있지 않지만 orElse 또는 orElseGet, orElseThrow등을 이용하여 처리가 필요하다.

 

Stream 클래스에는 참 유용한 메소드 많은 것 같다, 앞으로 조금 더 효율적이고 아름다운 코드를 짜기위해서 노력해야겠다.