반응형
메소드 참조(Method References)
메소드를 참조해서 매개변수 리턴타입을 알아내어 람다식에서 불필요한 매개변수를 제거하는 것이 목적
정적 메소드와 인스턴스 메소드 참조
클래스::메소드 // 정적(static) 메소드 참조
참조변수::메소드 // 인스턴스 메소드 참조
예제코드)
public class Calculator {
public static int staticAdd(int x, int y){
return x+y;
}
public int instanceAdd(int x, int y){
return x+y;
}
}
public class MethodReferences {
public static void main(String[] args) {
List<String> strList = Arrays.asList("안녕", "하세요");
strList.stream().forEach(System.out::println);
// static 메소드 참조
IntBinaryOperator operator;
operator = (x, y) -> Calculator.staticAdd(x, y);
System.out.println(operator.applyAsInt(1, 2));
operator = Calculator::staticAdd; // 메소드 참조
System.out.println(operator.applyAsInt(1, 2));
// instance 메소드 참조
Calculator calculator = new Calculator();
operator = (x, y) -> calculator.instanceAdd(x, y);
System.out.println(operator.applyAsInt(1, 2));
operator = calculator::instanceAdd; // 메소드 참조
System.out.println(operator.applyAsInt(1, 2));
}
}
매개 변수의 메소드 참조
메소드는 람다식 외부의 클래스 멤버일 수도 있고, 람다식에서 제공되는 매개변수의 멤버일 수도 있다.
(a, b) -> a.a메소드(b)
a의클래스::instanceMethod
예제코드)
public class MethodReferences2 {
public static void main(String[] args) {
ToIntBiFunction<String, String> function;
function = String::compareToIgnoreCase; // 매개 변수 메소드 참조
System.out.println(function.applyAsInt("hello", "HELLO") == 0 ? "동일한 문자열" : "문자열 다름");
}
}
생성자 참조
메소드 참조(method reference)방식으로 생성자도 참조할 수 있다.
(a, b) -> {return new 클래스(a,b);}
클래스::new
생성자가 여러개 오버로딩되어 있다면, 컴파일러는 functional interface의 추상 메소드 매개변수 타입과 개수가 같은 생성자를 찾아 실행한다.
예제코드)
public class Account {
private String id;
private String password;
public Account(String id) {
this.id = id;
}
public Account(String id, String password) {
this.id = id;
this.password = password;
}
}
public class MethodReferences3 {
public static void main(String[] args) {
Function<String, Account> function1 = Account::new;
Account account = function1.apply("아이디");
BiFunction<String, String, Account> function2 = Account::new;
Account account2 = function2.apply("아이디", "패스워드");
System.out.println(account);
System.out.println(account2);
}
}
// Account{id='아이디', password='null'}
// Account{id='아이디', password='패스워드'}
참고서적 ) 이것이 자바다.
반응형
'프로그래밍 노트 > JAVA' 카테고리의 다른 글
[JAVA] Format 클래스 (0) | 2019.10.23 |
---|---|
Class 클래스 (0) | 2019.10.21 |
[JAVA] Predicate 함수적 인터페이스 (Functional Interface) (0) | 2019.07.25 |
[JAVA] Operator 함수적 인터페이스 (Functional Interface) (0) | 2019.07.25 |
[JAVA] Function 함수적 인터페이스(Functional Interface) (0) | 2019.07.01 |