해당 포스트는 다음 블로그를 참고했습니다.
- https://d2.naver.com/helloworld/4911107
요 3주간 자바책을 몇권 읽었는데, 잘 나오지 않는 부분들이 있어서 그것에 대한 정리를 하고 싶어서 글을 쓰려 한다.
만약 Stream에 대해 가물가물하다면 다음 포스팅인 자바 람다식을 잠깐 보고 오면 좋겠다.
위의 코드를 사용할 일이 있었는데, Stream메소드라던지, :: 이라던지 처음보는 것들이 많아서 책을 뒤져다 봤는데 도서관에 책들에서 잘 나오지 않아서 확인해 보니, Java8부터 지원하는 것들이라서 그렇다고 한다. ( 2014년도에 나온 기능이라고 하는데, 그것보다 더 오래된 책들인가 보다.) 그래서 두고 두고 볼 수 없는 부분이라서 오랜만에 글을 쓰기로 했다.
해당 클래스는 Guest의 정보를 담는다.
그리고 이러한 Guest들은 MemoryRepository라는 클래스에 save함수를 통해 savedGuest라는 변수에 각각 담기게 된다.
이 때 save의 함수의 파라미터로 Guest...는 Guest클래스의 파라미터를 갯수에 상관없이 받고 그것은 guests라는 배열에 담겨진다.
해당 코드들은 담고나서 출력하면
다음과 같이 ArrayList에 담긴 Guest가 출력이 되는 모습을 볼수 있다.
해당 클래스는 자바 8 이전에 사용하는 방법이라고 한다.
회사 이름을 입력하면, 그 회사에 다니는 유저의 이름을 성적 순으로 리턴하는 함수이다.
하나 하나 살펴보자.
List<Guest> all 에는 repository에 담겨있는 모든 guest들을 List에 담는다.
List<Guest> filtered 에서는 filter 함수의 리턴 값을 가진다.
filter함수는 filtered라는 새로운 리스트를 생성한다.
이후 List<Guest> all 에 담긴 게스트들을 하나씩 꺼내서, company(찾고자 하는 회사명)와 guest.getCompany(게스트의 회사명) 이 동일한지 체크하여 맞는 값만 filtered에 담아 리턴한다.
이후에 sort메소드를 이용하여 성적 순으로 정렬한다.
Collections.sort()
Collections의 static 메소드인 sort()는 리스트를 받아서 그것을 정렬하는 메소드이다.
보통은 일반적으로 List타입이 무엇인가에 따라서 알아서 정렬 해준다. (Integer는 오름차순, String은 사전형으로)
하지만 List에 사용자가 지정한 클래스타입이 들어가 있다면 어떤 순서대로 정렬되는지 Override해주어야 한다.
위의 경우에는 Guest를 담고 있으므로 Comparator<Guest>를 생성하고 익명 객체에 바로 compare를 오버라이딩 해주었다.
비교할 순서는 성적순이므로, Integer.compare를 통해서 값을 리턴해주었다. ( Integer.compare는 두 수가 같을 시 0을 앞의 수가 클시 1을 뒤의 수가 클 시 -1을 리턴하여 sort()메소드를 동작시킨다.
해당 경우에는 Tom이 Max보다 성적이 높이 때문에 수정되지 않았다.
마지막으로 최종 리턴할 mapNames은 새로운 리스트를 생성한 후에 이름 값만 담아 리턴하게 된다.
결과적으로는 [Max, Tom]이 리턴 된다
다음은 Stream을 활용한 재정렬이다. 코드도 훨씬 줄었을 뿐만 아니라 이해하기도 좋다.
생김새가 ES6 배열 메소드와 매우 유사하다.
하나씩 살펴보면
Collection.stream()
모든 Collection의 자식들은 streams메소드를 이용할 수 있다. stream메소드는 Collection을 가지고 stream객체를 생성한다.
Stream.filter()
filter는 화살표 함수처럼 작동한다. filter의 파라미터는 Function<T,R>이다. 앞의 T는 사용자 객체나 리스트 같이 값을 담은 객체, R은 그 값들이다. Stream의 인자들을 하나씩 꺼내서 조건문을 실행시키고 참인 값만 Stream에 남긴다.
Stream.sorted
Collections.sort()와 같이 배열 타입이 무엇인가에 따라 정렬을 한다. 사용자가 생성한 객체타입일 경우에는 Comparator의 comparing메소드를 이용합니다.
Comparator.comparing()
Function<T,R> 를 파라미터로 가지며 역시 예제에선 Function<Guest, Integer>로 쓰였다.
Stream.map
Function<T,R> 를 파라미터로 가지며 filter와는 다르게 Function에서 표현하는 값 그대로를 가져온다.
Stream.collect()
정렬된 Stream을 하나의 리스트로 담기위해 사용된다.
결과는[Tom,Max]로 동일하다.
'Language > Java' 카테고리의 다른 글
[Java8] Strategy Pattern, FP, 1급 객체 (0) | 2019.04.14 |
---|---|
[Java]Collection 객체 응용(2) (0) | 2019.04.14 |
[Java]Comparable, Comparator (0) | 2019.04.14 |
[Java]Collection 객체 응용(1) (0) | 2019.04.12 |
[Java] 자바 람다식 (0) | 2019.04.09 |