-
람다와 스트림 - Predicate의 결합백엔드/자바 2021. 9. 1. 15:05
람다와 스트림 - 함수의 결합
수학에서 두 개의 함수를 결합할 수 있는 것처럼 자바에선 두 람다식을 결합할 수 있도록 하고 있다. 그리고 당연히 미리 준비된 메서드만 가져다 쓰면 된다. andThen() 예를 들어 위와 같은 코드가
sgcomputer.tistory.com
이전 파트에서 설명했듯이 Function 타입의 참조변수끼리는 결합이 가능하다.
그리고 이러한 결합은 Predicate타입의 참조변수끼리도 가능하다.
예를 들어서 위와 같은 메서드가 있다고 가정해보자.
if의 조건을 보면 논리 연산자 &&으로 조건이 이어진 것을 볼 수 있을 것이다.
이러한 논리 연산을 Predicate 간에도 할 수 있다.
and() - &&
예를 들어 위와 같은 코드가 있다고 가정해보자.
Predicate의 참조변수 pr1은 매개변수가 짝수인지 판별하는 람다식을 저장하고 있다.
그리고 참조변수 pr2는 매개변수가 10인지 판별하는 람다식을 저장하고 있다.
이때 참조 변수 pr1을 통해 and() 메서드를 불러와 그 안에 참조변수 pr2를 매개변수로 준다.
그러면 pr1의 조건과 pr2의 조건이 &&(and) 즉 두 조건이 연결되는 기능을 갖게 된다.
그리고 당연히 결과는 짝수인 8만 넣을 경우 위와 같이 false가 나오고 10을 넣어야 true가 나온다.
그 외에 다른 논리 연산자도 Predicate에서 and()와 같은 메서드를 제공해준다.
or() - ||
and() 메서드가 &&의 기능을 가졌다면 or() 메서드는 이름대로 ||(or)의 기능을 가진다.
위의 코드를 보도록 하자.
이전의 and()와 사용법은 동일하다. 참조변수로 or() 메서드를 불러온다.
그리고 매개변수로 다른 참조변수를 넣어주면 두 조건끼리 결합이 가능하다.
그리고 and()와 달리 or()는 두 조건 중 하나만 만족하면 된다.
그래서 8을 test() 메서드에 넣었을 때 pr1 조건에 맞으므로 true가 출력되는 것을 볼 수 있다.
negete() - !
마지막으로 알아볼 negate()는 논리 연산자 !(not)의 기능을 한다.
논리 연산자 !의 경우 조건이 두개가 필요하지 않다.
그래서 and()와 or()와 달리 단독으로 써준다.
위 코드처럼 Predicate 참조변수를 통해서 negate()를 불러오기만 하면 된다.
이때 negate()의 반환 값은 negate()를 불러온 참조 변수의 조건과 반대되는 조건이다.
즉 코드를 기준으로 한다면 pr1의 조건을 반대로 적용한게 negate()의 반환값이다.
그래서 최종적으로 negate()의 조은 !(i%2==0)이 된다.
그래서 10을 test() 메서드에 넣어줄 경우 false가 출력된다.
논리연산자 메서드끼리의 합성
지금까지 이야기했듯이 논리 연산자는 and(), or(), negate() 메서드로 사용가능했다.
그리고 최종적으로는 이 논리 연산자 메서드끼리 결합도 가능하다.
위 코드와 같이 and()와 negate()를 결합하는 등의 조합도 가능하다.
참고로 풀이를 하자면 result의 조건은 !( i%2==0 && i ==0 )이다.
그래서 8을 넣으면 true, 10을 넣으면 false가 출력된다.
'백엔드 > 자바' 카테고리의 다른 글
람다와 스트림 - 메소드 참조(method reference) (0) 2021.09.14 람다와 스트림 - 컬렉션과 함수형 인터페이스 (0) 2021.09.01 람다와 스트림 - 함수의 결합 (0) 2021.08.25 람다와 스트림 - java.util.function - part2 (0) 2021.08.25 람다와 스트림 - java.util.function - part1 (0) 2021.08.24