본문 바로가기
java

Lambda 03 Predicate의 결합

by 킹차니 2021. 12. 26.

 

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