-
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번으로 실행 순서로 하는 새로운 객체 인스턴스(익명 함수)가 생성된다.
'개발언어 > JAVA' 카테고리의 다른 글
JAVA 자료구조 (배열) - 주식을 사고팔기 가장 좋은 시점 (1) 2023.12.22 JAVA 람다와 스트림 - 컬렉션 프레임워크(CF)와 함수형 인터페이스 (1) 2023.12.18 JAVA 람다와 스트림 - java.util.funtion 패키지 (1) 2023.12.18 JAVA 람다와 스트림 - 함수형 인터페이스 (0) 2023.12.15 JAVA 람다와 스트림 - 람다식(Lambda Expression) (1) 2023.12.15