import java.util.Arrays;
import java.util.List;
import java.util.function.BinaryOperator;
import java.util.function.IntBinaryOperator;
class MathBox {
// 클래스::메소드 --> 정적(static) 메소드 참조
public static int staticPlus(int x, int y){
return x+y;
}
// 참조변수::메소드 --> 인스턴스 메소드 참조
public int sum(int x, int y){
return x+y;
}
// 정수 빼기
public int sub(int x, int y){
return x-y;
}
// 정수 나누기
public int division(int x, int y){
return x / y;
}
// 실수 나누기
public Float float_div(Float x, Float y){
return x / y;
}
}
public class Method_References {
public static void main(String[] args) {
List<String> strList = Arrays.asList("안녕", "하세요");
strList.stream().forEach(System.out::println);
// static 메소드 참조
IntBinaryOperator operator1;
// 메소드 참조해서 매개변수 리턴타입 알아내 람다식에서 불필요한 매개변수 제거 목적
operator1 = MathBox::staticPlus; // 메소드 참조
System.out.println(operator1.applyAsInt(5, 3));
operator1 = (x, y) -> MathBox.staticPlus(x, y);
System.out.println(operator1.applyAsInt(3, 5));
// instance 메소드 참조
MathBox calculator = new MathBox();
IntBinaryOperator operator2 = calculator::sum; // 메소드 참조
System.out.println("더하기 : " + operator2.applyAsInt(11, 32));
operator1 = (x, y) -> calculator.sum(x, y);
System.out.println(operator1.applyAsInt(11, 32));
operator2 = calculator::sub; // 메소드 참조
System.out.println("빼기 : " + operator2.applyAsInt(11, 30));
operator2 = calculator::division; // 메소드 참조
System.out.println("나누기 : " + operator2.applyAsInt(15, 4));
BinaryOperator<Integer> operator3 = (n1, n2) -> n1 + n2; // 타입 추론
Integer sum = operator3.apply(10, 100);
System.out.println(sum);
BinaryOperator<Float> operator4 = calculator::float_div;
System.out.println("나누기 : " + operator4.apply(15.0f, 4.0f));
BinaryOperator<Float> operator5 = (n1, n2) -> n1 / n2; // 타입 추론
Float div = operator5.apply(15.0f, 4.0f);
System.out.println(div);
}
}