람다식을 사용하기 위한 API
인터페이스에 구현할 메소드가 하나 뿐인 인터페이스
enum과 함께 사용하면 좋음!
public enum Operator {
PLUS("+", (a, b) -> a + b),
MINUS("-", (a, b) -> a - b),
MULTIPLY("*", (a, b) -> a * b),
DIVIDE("/", (a, b) -> a / b);
private final String sign;
private final BiFunction<Long, Long, Long> bi;
Operator(String sign, BiFunction<Long, Long, Long> bi) {
this.sign = sign;
this.bi = bi;
}
public static long calculate(long a, long b, String sign) {
Operator operator = **Arrays.stream(values())**
.filter(v -> v.sign.equals(sign))
.findFirst()
.orElseThrow(IllegalArgumentException::new);
return operator.bi.apply(a, b);
}
}
public static void main(String[] args) {
String question = "4*7";
String[] values = question.split("");
long a = Long.parseLong(values[0]);
long b = Long.parseLong(values[2]);
long result = Operator.calculate(a, b, values[1]);
System.out.println(result); //28
}
new 연산자로 생성한 문자열과 리터럴로 생성한 문자열은 내부의 값은 같아서
equals()는 true를 반환하지만 실제 주소를 비교하는 ==는 false를 반환
(동등 비교 연산자인 ==는 실제 객체가 가지고 있는 주솟값을 비교하는 연산자이기 때문)