Predicate의 결합
and(), or(), negate()로 두 Predicate를 하나로 결합(default메소드)
A.and(B)는 A와 B의 and연산 결과
A.or(B)는 A와 B의 or연산 결과
A.negate()는 A의 not연산 결과
Predicate<Integer> p = i -> i < 100;
Predicate<Integer> q = i -> i < 200;
Predicate<Integer> r = i -> i%2 == 100;
Predicate<Integer> notP = p.negate(); // negate는 not이므로, i >= 100 이된다.
Predicate<Integer> all = i -> notP.and(q).or(r); // 100<=i && i<200 || i%2==0
Predicate<Integer> all2 = i -> notP.and(q.or(r)); // 100<=i && ( i<200 || i%2==0 )
System.out.println(all.test(2)); //true // test는 Preducate가 가지고 있는 추상메소드
System.out.println(all2.test(2)); //false
System.out.println(all.test(2)); //true // test는 Preducate가 가지고 있는 추상메소드
System.out.println(all2.test(2)); //false
등가비교를 위한 Predicate의 작성에는 isEqual()를 사용한다.(static메소드)
Predicate<String> p = Predicate.isEqual(str1); // isEqual()은 static 메소드
Boolean result = p.test(str2) // str1과 str2가 같은지 비교한 결과를 반환
//위의 두 문장을 하나로 하면
===> boolean result = Predicate.isEqual(str1).test(str2);
아래는 예시 문제
public class Ex {
public static void main(String[] args) {
Function<String, Integer> f = s -> Integer.parseInt(s);
Function<Integer, String> g = i -> Integer.toBinaryString(i);
Function<String, String> h = f.andThen(g);//f를 실행하고 그 실행결과로 g를 실행
Function<Integer, Integer> h2 = f.compose(g);//g를 실행하고 그 실행결과로 f를 실행
System.out.println(h.apply("FF")); // "FF" -> 256 -> "11111111"
System.out.println(h2.apply(2)); // 2 -> "10" -> 16
Function<String, String> f2 = x -> x; //항등함수(identify function)
System.out.println(f2.apply("AAA"));
Predicate<Integer> p = i -> i < 100;
Predicate<Integer> q = i -> i < 200;
Predicate<Integer> r = i -> i%2 == 0;
Predicate<Integer> notP = p.negate(); // i>= 100
Predicate<Integer> all = notP.and(q.or(r));
System.out.println(all.test(150));
String str1 = "abc";
String str2 = "abc";
// str1과 str2가 같은지 비교한 결과를 반환
Predicate<String> p2 = Predicate.isEqual(str1);
boolean result = p2.test(str2);
System.out.println(result);
}
}
실행결과:
11111111
16
true
true
컬렉션 프레임웍과 함수형 인터페이스
인터페이스 | 메소드 | 설명 |
Collection | boolean removeIf(Predicate<E> filter) | 조건에 맞는 요소를 삭제 |
List | void replaceAll(UnaryOperator<E> operator) | 모든 요소응 변환하여 삭제 |
Iterable | void forEach(Consumer<T> action) | 모든 요소에 작업 action을 수행 |
Map | V compute(K key, BiFunction<K, V, V> f) | 지정된 키의 값에 작업 f를 수행 |
Map | V computeIfAbsent(K key, BiFunction<K, V, V> f) | 키가 없으면, 작업 f 수행 후 추가 |
Map | V computeIfPresent(K key, BiFunction<K, V, V> f) | 지정된 키가 있을 때, 작업 f수행 |
Map | V merge(K key, V value, BiFunction<V, V, V> f) | 모든 요소에 병합작업 f를 수행 |
Map | void forEach(BiConsumer<K, V> action) | 모든 요소에 작업 action수행 |
Map | void replaceAll(BiFunction<K, V, V> f) | 모든 요소에 치환작업 f를 수행 |
위의 인터페이스들 사용 예시:
list.forEach(i-> System.out.print(i+", ")); //list의 모든 요소 출력
list.removeIf(x-> x%2==0 || x%3==0); //2또는 3의 배수를 제거
list.replaceAll(i-> i*10); //모든 요소에 10을 곱한다.
//map의 모든 요소를 {k, v}의 형식으로 출력
map.forEach((k,v)-> System.out.print("{"+k+","+v+"}, "));
위를 그대로 코드에 사용
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Ex {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
for(int i=0; i<10; i++) list.add(i);
list.forEach(i-> System.out.print(i+", ")); //list의 모든 요소 출력
System.out.println();
list.removeIf(x-> x%2==0 || x%3==0); //2또는 3의 배수를 제거
System.out.println(list);
list.replaceAll(i-> i*10); //모든 요소에 10을 곱한다.
System.out.println(list);
Map<String, String> map = new HashMap<>();
map.put("1", "1");
map.put("2", "2");
map.put("3", "3");
map.put("4", "4");
//map의 모든 요소를 {k, v}의 형식으로 출력
map.forEach((k,v)-> System.out.print("{"+k+","+v+"}, "));
System.out.println();
}
}
실행결과:
0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
[1, 5, 7]
[10, 50, 70]
{1,1}, {2,2}, {3,3}, {4,4},
출처: 남궁성님 유튜브 강의
https://www.youtube.com/user/MasterNKS
'java' 카테고리의 다른 글
Lambda 05 Stream (0) | 2021.12.27 |
---|---|
Lambda 04 메소드 참조 (0) | 2021.12.26 |
Lambda 02 - java.util.function 패키지 (0) | 2021.12.23 |
Lambda 01 (0) | 2021.12.23 |
Serializable (0) | 2021.11.21 |