🏃♂️ 들어가기 앞서..
본 게시물은 스터디 활동 중에 작성한 게시물로 자바의 정석-기초편 교재를 학습하여 정리하는 글입니다.
※ 스터디 Page : 〔투 비 마스터 : 자바〕
*해당 교재의 목차 순서와 구성을 참고하여 작성하며
각 내용마다 부족할 수 있는 내용이나 개인적으로 궁금한 점은
추가적인 검색을 통해 채워나갈 예정입니다.
Predicate
결합본래 조건식으로 사용되는
boolean
반환하는 함수형 인터페이스가 Predicate 인터페이스이다.
일반적인 조건식에서
두 개 이상의 조건식을 결합시킬 수 있듯
Predicate
인터페이스 또한
논리 연산자 && (and)
, || (or)
, ! (not)
로 결합할 수 있다.
하지만 일반적인 조건식과는
형태와 방법이 조금 다르다.
Predicate
를 결합할 땐,
and()
, or()
, negate()
메서드를 사용한다.
( negate()
를 Predicate 뒤에 붙이면 전체 부정이 된다. )
Predicate<Integer> p = i -> i < 100 ;
Predicate<Integer> q = i -> i < 200 ;
Predicate<Integer> r = i -> i % 2 == 0 ;
Predicate<Integer> notP = i -> p.negate() ; // i >= 100
Predicate<Integer> all = notP.and(q.or(r)) ; // 100 <= i && (i < 200 || i%2 == 0 ) 과 동일
Predicate<Integer> all2 = notP.and(q).or(r); // 100 <= i && i < 200 || i%2 == 0 과 동일
System.out.println(all.test(150)) ; // true
System.out.println(all.test(2)) ; // false
System.out.println(all2.test(2)) ; // true
Predicate
인터페이스가 가지고 있는
static 메서드 중 하나인 isEqual()
은
두 대상을 비교하는 Predicate를 만들 때 사용한다.
즉,
Predicate 인터페이스 타입의 참조변수에
미리 고정값을 지정해놓는다.
String str1 = "abc" ;
Predicate<String> p = Predicate.isEqual(str1) ;
그 후,
또 다른 비교 대상을
test()
의 매개변수로 지정하여
비교하는 방식인 것이다.
System.out.println(p.test("bcd") ; // false
// 위 과정들을 합쳐서 한 줄로 줄일 수 있다.
// str1.equals("bcd") 와 다르지 않다.
boolean result = Predicate.isEqual(str1).test("bcd") ;
System.out.println(result) ; // false
※ 두 개 이상의 함수형 인터페이스 구현체를 연결
:andThen()
▶( F.I 1 ).andThen( F.I 2 )
:F.I 1
→F.I 2
compose()
▶( F.I 1 ).compose( F.I 2 )
:andThen()
역순 배치 _F.I 2
→F.I 1
- 단, 한 인터페이스의 입력값_매개변수 타입과 다른 하나의 인터페이스 반환값 타입이 동일해야한다.
Function<String, Integer> f = (s) -> Integer.parseInt(s, 16) // 입력값 : String / 반환값 : Integer Function<Integer, String> g = (i) -> Integer.toBinaryString(i) // 입력값 : Integer / 반환값 : String Function<String, String> h = f.andThen(g) ; // 두 함수 하나의 함수로 결합 Function<Integer, Integer> rh = f.compose(g) ; // andThen 역순 == g.andThen(f)
Collection Framework
)JDK 1.8 버전부터는
인터페이스에서 default 메서드 와 static 메서드를 가질 수 있게 되었다.
Interface | Method | 설명 |
---|---|---|
Collection | boolean removeIf( ) | 조건에 맞는 요소 삭제 |
List | void replaceAll( UnaryOperator<E> operator ) | List 내 모든 요소 변환 & 대체 |
Iterable | void forEach( Consumer<T> action ) | 모든 요소에 작업(action) 수행 |
Map | V compute( K key, BiFunction<K,V,V> f ) _ 람다식 | 지정된 키의 값에 작업(f) 수행 |
V computeIfAbsent( K key, Function<K,V> f ) _ 람다식 | 키가 없으면, 값에 작업(f) 수행 & 추가 | |
V computeIfPresent( K key, BiFunction<K,V,V> f ) _ 람다식 | 지정 키가 있으면, 값에 작업(f) 수행 | |
V merge( K key, V value, BiFunction<V,V,V> f ) | 모든 요소에 병합작업(f) 수행 | |
void forEach( BiConsumer<K,V> action ) | 모든 요소에 작업(action) 수행 | |
void replaceAll( BiFunction<K,V,V> f ) | 모든 요소에 치환작업(f) 수행 |
* coumpute
로 시작하는 메서드 : Map의 value를 변환하는 작업
* merge()
메서드 : Map을 병합하는 작업