이 포스팅의 코드 및 정보들은 강의를 들으며 정리한 내용을 토대로 작성한 것입니다.
Java 8 이후로 추가된 default method로 인해 API에도 변화가 생겼다.
그 변화된 API 중 자주 사용되는 API에 대해서 알아보겠다.
List에 운동 목록을 추가시켜놓고 출력하는 예제로 forEach()를 살펴보겠다.
sports에 forEach()를 쓰려고 하면 (Functional interface의) Consumer타입의 인자를 받으려고 하는 걸 볼 수 있다.
각각의 String이 차례대로 들어올 거고, return하는 값이 없는 것이 Consumer이다.
매개변수로 받는 s를 출력한다고 하면 괄호 안에 System.out.print()로 s를 넣고 출력할 수 있지만
sports.forEach(System.out::println);
이렇게 줄일 수도 있다.
단순 for문을 활용한 for each문보다 보기 훨씬 편해졌다.
Spliterator<String> spliterator = sports.spliterator();
spliterator()는 쪼개는 기능(split)을 가지고 있는 iterator라고 보면 된다.
위의 iterator와 마찬가지로 순환하는 기능을 사용할 수 있는데, iterator의 hasNext를 spliterator에서는 tryAdvance()를 사용해서 Consumer 타입을 받는다.
사실 이거는 split 기능을 쓰진 않았고, iterator 기능만 사용했다.
spliterator에 있는 trySplit()을 이용하면, sports에 있는 내용물의 반이 잘린다. 이를 다른 이름의 Spliterator 함수 인터페이스에 담아서 출력을 하면 다음과 같이 뒤에 잘린 것이 먼저 출력되고, 그 다음에는 앞에 잘린 것들이 출력되는 것을 확인할 수 있다.
순서에는 상관없이 parallel하게 처리할 때 유용하게 쓰일 수 있다.
sports.stream();
이 stream()이라는 것은
Collection에 있으며, Collection의 하위 인터페이스들은 다 이 stream()을 가지고 있다.(default method의 기본 규칙) 또한, 이 stream()을 보면 spliterator()가 있는 걸 확인할 수 있다.
stream()은 element들을 stream으로 만들어서 functional하게 처리할 수 있는 것이다.
stream()을 활용해서 sports 원소들을 모두 대문자로 바꾼 후, 그중 B로 시작하는 것만 가져와서 개수를 세는 식을 만들었다. B로 시작하는 것은 Boxing 하나이므로 결과적으로 1이 출력되는 것을 확인할 수 있다.
count() 말고 collect()로 가져와서 다양하게 활용할 수 있다.
반대로 b로 시작하는 것을 removeIf()를 통해 거르고(제외하고) 그 나머지를 가져올 수 있다.
Comparator는 주로 정렬할 때 자주 쓰이는 인터페이스이다.
List의 sort()로 정렬을 하려고 할 때, sort()의 파라미터로 Comparator 타입을 받도록 되어있다. 이 Comparator는 함수형 인터페이스이다.
String::compareToIgnoreCase로 오름차순으로 정렬할 수도 있다.
만약, 이를 역순으로(내림차순) 정렬하고 싶다면
String::compareToIgnoreCase를 따로 꺼내고, 꺼낸 함수형 인터페이스에 reversed()를 추가하면 역순으로 정렬된다.
추가적으로 다른 조건으로 비교하고 싶다, 또 다른 정렬 조건을 더하고 싶을 때 쓸 수 있다.
nullsFirst()는 null 값이면 우선수위가 더 높다고 정렬할 때 더 앞쪽으로 밀어준다.
nullsLast()는 그의 반대로 뒤쪽으로 밀어준다.
자바 8에서 추가한 기본 메서드로 인한 API의 변화
Iterable의 기본 메서드
Collection의 기본 메서드
Comparator의 기본 메서드 및 스태틱 메서드