[JAVA] 람다와 스트림 ( Lambda & Stream ) ④

DongGyu Jung·2022년 4월 30일
0

자바(JAVA)

목록 보기
52/60
post-thumbnail

🏃‍♂️ 들어가기 앞서..

본 게시물은 스터디 활동 중에 작성한 게시물로 자바의 정석-기초편 교재를 학습하여 정리하는 글입니다.
※ 스터디 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 1F.I 2
compose()( F.I 1 ).compose( F.I 2 ) : andThen() 역순 배치 _ F.I 2F.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)


🌌 F.I 메서드 ( + Collection Framework )

JDK 1.8 버전부터는
인터페이스에서 default 메서드 와 static 메서드를 가질 수 있게 되었다.

InterfaceMethod설명
Collectionboolean removeIf( )조건에 맞는 요소 삭제
Listvoid replaceAll( UnaryOperator<E> operator )List 내 모든 요소 변환 & 대체
Iterablevoid forEach( Consumer<T> action )모든 요소에 작업(action) 수행
MapV 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을 병합하는 작업

0개의 댓글