2020-12-22
기존에 Consumer와 Supplier 인터페이스는 매개 값만 있고 리턴 값은 없거나 매개 값은 없고 리턴 값만 있는 경우였다. 하지만 Operator의 경우 매개변수를 받으면서 동시에 리턴값도 가지고 있는 인터페이스다. 구체적인 사용법을 알아보자.
가장 기초적인 int형 Operator인 inIntBinaryOperator를 활용해 구체적인 예를 작성하였다. 코드는 아래와 같다.
package LambdaOperator;
import java.util.function.IntBinaryOperator;
public class main {
private static int[] scores = {60, 70, 80};
public static int check (IntBinaryOperator operator) {
int result = scores[0];
//결과값에 점수의 초기값을 넣어준다.
for(int score : scores) {
result = operator.applyAsInt(result, score);
//result와 score를 int형 연산을 한 결과를 result에 다시 넣는 코드
//아직 구현되지 않아 람다식으로 구현을 해주어야 한다.
}
return result;
}
//////////////////////////////////////////////////////////////////////
public static void main(String[] args) {
}
}
코드에서 보는 것과 같이 3명의 점수가 들어가 있는 scores배열과 이들 간의 점수를 비교할 수 있는 check 메서드를 하나 만들었다. operator는 함수적 인터페이스이다. 때문에 operator의 속한 메서드 applyAsInt에 자신의 비교할 때 필요한 int형 매개 값 2개를 넣어주고 차후 사용할 때 람다식으로 해당 부분을 구현해주면 된다.
(물론 인터페이스가 BinaryOperator / UnaryOperator / DoubleBinaryOperator . . . 등에 따라 추상 메서드는 달라지게 된다. 보통 applyAsXXX 와 같이 XXX에 해당 인터페이스의 타입을 적어주면 된다. Ctrl + Space를 해보면 자동완성이 될 것이다.)
이제 해당 클래스를 구현하여 사용해 보도록 하자.
package LambdaOperator;
import java.util.function.IntBinaryOperator;
public class main {
private static int[] scores = {60, 70, 80};
public static int check (IntBinaryOperator operator) {
int result = scores[0];
//결과값에 점수의 초기값을 넣어준다.
for(int score : scores) {
result = operator.applyAsInt(result, score);
//result와 score를 int형 연산을 한 결과를 result에 다시 넣는 코드
//아직 구현되지 않아 람다식으로 구현을 해주어야 한다.
}
return result;
}
//////////////////////////////////////////////////////////////////////
public static void main(String[] args) {
int max = check(
(a,b) ->{
return a > b ? a : b;
}
);
int min = check(
(a,b) ->{
return a < b ? a : b;
}
);
System.out.println(max + " " + min);
}
}
구현 코드는 이해를 돋기 위해 최대한 간단하게 구현하였다. 위의 체크코드와 같이 매개 값 두 개를 비교하여, max 변수에는 최댓값 min 변수에는 최솟값이 들어가도록 람다식을 작성하였다. 결과를 출력해보면 아래와 같이 정상적으로 원하는 값이 도출되는 것을 확인할 수 있다.