오늘은 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 클래스에는 참 유용한 메소드 많은 것 같다, 앞으로 조금 더 효율적이고 아름다운 코드를 짜기위해서 노력해야겠다.
'JAVA' 카테고리의 다른 글
JAVA의 Optional 정리 (Java 8 기준) (0) | 2021.03.22 |
---|---|
Eescape된 HTML 태그를 JAVA에서 Unescape (2) | 2021.03.03 |
String 배열을 다른자료형 배열로 변경하는 방법 (0) | 2020.12.31 |
JAVA System.in에서의 EOF(End of File) 컨트롤 (0) | 2020.12.23 |
JAVA 입력과 출력(Scanner, BufferedReader..) (0) | 2020.12.17 |