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을반환 Xcollect()/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::getTitleSystem.out::println