Java 8
에 오면서인터페이스 구성에 변화
가 생김
- 정적(
Static
) 메소드를 가질 수 있게됨
- 사실
정적 메소드
는인스턴스와 상관이 없어서
기술적으로 제한될 이유는 없음Java 8
부터는유연한 인터페이스
를 위해정적 메소드
를 가질 수 있게 됨
- 기본 메소드(
Default Method
) 추가
인터페이스
에기본 메소드
를추가
해서필요한 하위 클래스만 구현
해서 사용가능해짐 -->유연성
인터페이스에 새로운 기능을 추가
할 때 유용
Java 8
에 도입인터페이스
에메소드 선언
이 뿐만 아니라,구현체를 제공
할 수 있는 방법- 해당
인터페이스를 구현한 클래스
를 깨트리지 않고새 기능을 추가
하기 좋음 -->유연성
- 본인이 원하는
하위 인터페이스
,클래스
에만제공
할 수 있음
구현체가 모르게 구현된 기능
이라서리스크
가 존재
컴파일 에러는 발생하지 않지만
, 구현체에 따라런타임 에러가 발생할 수 있다
@implSpec
라는자바독 태그
를 사용해서문서화 작업
을 해줘야 함
-->해당 메서드
와하위 클래스 사이
의관계를 설명
해서,상속 혹은 호출 관련 정보
를문서화
해주어야 함
Object가 제공하는 기능
(equals
,hasCode
)는기본 메소드로 제공할 수 없다
구현체가 재정의
해야함인터페이스를 상속받는 인터페이스
에서기본 메서드(default method)
를 다시추상메소드로 변경
가능인터페이스 구현체
가재정의 할 수 있음
디폴트 메서드
가기존의 메서드
와충돌
하는 문제가 발생할 수 있다
여러 인터페이스
의디폴트 메서드 간
충돌
-->인터페이스를 구현한 클래스
에서디폴트 메서드
를오버라이딩
하면 해결디폴트 메서드
와조상 클래스의 메서드
간의충돌
-->조상 클래스 메서드
가우선적으로 적용
됨
--> 이것도 위 해결 처럼직접 오버라이딩
을 해서해결
할 수 있음
기본 메소드가 등장
하고 우리가 기존에 사용하던 객체들의API가 추가
- Iterable
- forEach(
Consumer
)- spliterator()
split 기능
을 가진iterator
.tryAdvance()
를 통해 순회.trySplit()
을 통해균등하게 분할
- Collection
- stream() / parallelStream() :
stream 단순 처리
/stream을 병렬 처리
- removeIf(
Predicate
) :true인 것을 제외하고 반환
- spliterator()
- Comparator
- 기본 메서드
- reversed()
- thenComparaing() :
추가적으로 더 비교
할 때 사용- 정적 메서드
- reverseOrder() / naturalOrder()
- nullsFirst() / nullLast()
- comparaing()
ref : https://dororongju.tistory.com/137
Stream
- 저장된 데이터의 흐름
Stream API
를 통해유연하게 데이터를 처리
할 수 있음데이터를 담고 있는 저장소
(컬렉션
)가 아님원본 데이터
는변경되지 않는다
스트림으로 처리
하는 데이터는오직 한 번만 처리
- 무제한일 수도 있다
계속 들어오는 실시간 데이터
를 처리할 수도 있음 (Short Circuit 메소드
로 제한 가능)
- 손쉽게 병렬처리 가능
.parallelStream()
을 사용해서 손쉬운 병렬처리 가능
- 중개 오퍼레이션(
intermediate operation
)은 근본적으로Lazy
하게 동작
모든 데이터
를하나의 오퍼레이션 단위
로수행하는 것이 아님
하나의 데이터
를모든 오퍼레이션의 순서
에 맞게수행
- 결과적으로
불필요한 연산을 하지 않는 전략
중개 오퍼레이션만
있으면동작을 수행하지 X
-->종료 오퍼레이션
이필요
- Eager
- Lazy
스트림 파이프 라인(Stream Pipe Line)
스트림에 존재
하는오퍼레이션의 집합
0
또는다수
의 중개(intermediate
) 오퍼레이션과한개
의 종료(terminal
) 오퍼레이션으로 구성- 반드시 종료(
terminal
) 오퍼레이션을실행할 때에만 처리
중개(intermediate) 오퍼레이션
Stream
을반환 O
- 종류
- Stateless
대부분의 중개 오퍼레이션
이 속함이전 소스 데이터를 사용
은 하되,연산 중
에다시 이전 값을 참조하지는 않는
연산filter()
/map()
/limit()
/skip()
등- Stateful
연산 중
에이전 값을 참조
해야 하는 오퍼레이션distinct()
/sorted()
등
종료(terminal) 오퍼레이션
Stream
을반환 X
collect()
/allMatch()
/count()
/forEach()
/min()
/max()
등
- filter(
Predicate
) :true에 해당하는 요소
들만선택
해서 거르는 용도- map(
Function
) :값을 변경
해서반환
하는 용도
- flatMap(
Function
)
스트림의 형태
가배열
과 같을 때,모든 원소
를단일 원소 스트림
으로 반환2개의 ArrayList
-->1개의 ArraList
- 생성 관련
- generate(
Supplier
)- Iterate(
T seed
,UnayOperator
)
- 제한 관련
- limit(
long
)- skip(
long
)
- count() : 개수 세는 용도
- 특정 조건 만족
- anyMatch() :
조건에 맞는게 하나라도
있으면true
- allMatch() :
조건에 모두 맞으면
true
- nonMatch() :
조건에 맞는게 없으면
true
- 스트림을 하나의 데이터로 만들기
- reduce(
identity
,BiFunction
)- collect()
- sum()
- max()
병렬 처리 비교
- 일반
stream()
을 사용하면하나의 쓰레드
에서 수행됨parallelStream()
을 사용하면여러개의 쓰레드
로병렬 처리
로 수행됨- 반드시
병렬처리가 효율적인 것은 아님
-->쓰레드 생성, 문맥교환
등의cost
발생
다양한 예시(1)
filter()
/map()
은중개형 오퍼레이션
forEach()
/collect()
는종료형 오퍼레이션
flatMap
을 통해2개의 ArrayList
를하나
로flat화
다양한 예시(2)
skip()
/limit()
을 통해 제한anyMatch()
를 통해 하나라도 있으면 true 반환메소드 레퍼런스
를 통해 간결하게 표현 가능!
OnlineClass::getTitle
System.out::println