ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JAVA람다와 스트림 - Predicate의 결합
    개발언어/JAVA 2023. 12. 18. 15:54

    Predicate의 결합

    ▶ && and(), || or(), != negate()로 Predicate를 하나로 결합(default메서드)

     

    Predicate가 함수형 인터페이스 이므로 default 메서드, static 메서드, 추상메서드를 가질 수 있다. 

    Predicate<Integer> p = i -> i < 100;
    Predicate<Integer> q = i -> i < 200;
    Predicatewe<Integer> r = i -> i%2 == 0;

     

    위 코드와 같은 조건식들이 있을 때 조건식들을 and(), or(), negate()를 활용해서 결합할 수 있다.

     

    Predicate<Integer> notP = p.negate();  // i >= 100
    Predicate<Integer> all = notP.and(q).or(r); // 100 <= i && i < 200 || i%2==0
    Predicate<Integer> all = notP.and(q.or(r)); // 100 <= i && (i < 200 || i%2==0)
    
    System.out.println(all.test(2));  //true
    System.out.println(all2.test(e)); //false

     

     

    💡 tip) 인터페이스가 가질 수 있는 메서드

    - 추상 메서드

    JDK 1.8이후(Java8 )
    - default 메서드
    - static 메서드 

     

     

    ▶등가비교를 위한 Predicate의 작성에는 isEqual()를 사용(static메서)

    두 개의 함수를 마치 하나인 것 처럼 연결 할 때 쓰는 것이 andThen()메서드 이다.

     

    Predicate<String> p = Predicate.isEqual(str1); //isEquals
    Beelean result = p.test(str2);  //str1과 str2가 같은지(논리적) 비교한 결과를 반환
    
    boolean result = Predicate.isEqual(str1).test(str2);
    
    //위 코드는 다음 코드와 같다.
    str1.equals(str2);

     

     

    정리 예제

    package lambdaFunction;
    
    import java.util.function.Function;
    import java.util.function.Predicate;
    
    public class Example2 {
        public static void main(String[] args) {
            //문자열을 16진수 int 값으로 변환
            Function<String,Integer> f = (s) -> Integer.parseInt(s,16);
            //int 값을 2진수로 바꾸어 준다.
            Function<Integer, String> g = (i) -> Integer.toBinaryString(i);
    
    
            Function<String,String> h = f.andThen(g); //함수: 문자열 -> 16진수(int) -> 2진수(문자열)
            Function<Integer,Integer> h2 = f.compose(g); //함수: int값 -> 2진수(문자열) -> 16진수(int)
    
            System.out.println(h.apply("FF")); //결과: "FF" -> 255 -> "11111111"
            System.out.println(h2.apply(2));   //결과: 2 -> "10" -> 16
    
            Function<String,String> f2 = x -> x;   //항등 함수(identity function)
            System.out.println(f2.apply("AAA")); //결과: 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";
            String str1 = new String("abc");
            String str2 = new String("abc");
    
            //str1과 str2가 같은지 비교한 결과
            Predicate<String> p2 = Predicate.isEqual(str1);
            boolean result = Predicate.isEqual(str1).test(str2);
            // str1.equals(str2);
            System.out.println("str1과 str2가 같은 가(논리적)? "+ result);
    
        }
    }

     

    1. andThen( )메서드

    두 개의 함수를 마치 하나인 것 처럼 연결 할 때 쓰는 것이 andThen()메서드 이다.

    f 함수의 출력과 g의 출력이 일치 해야 연결할 수 있다. 이 부분이 다르면 연결 할 수 없다.

    여러 함수를 하나로 연결하면 하나의 함수로  2개 작업을 한번에 할 수 있다. 

     

    2. compose()메서드

    `f.compose(g)``g.andThen(f)`와 같다.

    함수를 결합할때 매개변수로 온 함수를 1번으로 compose() 메서드를 실행 시킨 객체 인스턴트(익명 함수)를 2번으로 실행 순서로 하는 새로운 객체 인스턴스(익명 함수)가 생성된다.

     

     

     

    [출처 - 자바의 정석 - 기초편 , 저 남궁성]

    https://www.youtube.com/watch?v=0Sp9eFRV8gE

     

    댓글

Designed by Tistory.