[Java] 익명 클래스에서 람다 함수로 변경

익명 클래스

1
2
3
4
5
6
7
8
9
10
public void anomymousClass() {
final String hello = FUNLEE.callHello(new Hello() -> {
@Override
public String hello(String name) {
return "Hello, " + name;
}
});

System.out.println(hello);
}

함수 이름 제거

1
2
3
4
5
6
7
public void anomymousClass() {
final String hello = FUNLEE.callHello((String name) -> {
return "Hello, " + name;
});

System.out.println(hello);
}

파라미터 타입 제거

1
2
3
4
5
6
7
public void anomymousClass() {
final String hello = FUNLEE.callHello(name -> {
return "Hello, " + name;
});

System.out.println(hello);
}

리턴문 제거

1
2
3
4
5
public void anomymousClass() {
final String hello = FUNLEE.callHello(name -> "Hello, " + name);

System.out.println(hello);
}

예제

1
2
3
4
5
6
7
8
9
@RequiredArgsConstructor
@Service
public class FunleeService {
private final FunleeRepository repo;

public Funlee findById(long id) {
return repo.findById(id).orElseGet(Funlee::new);
}
}
1
2
3
4
// Optional.class
public T orElseGet(Supplier<? extends T> supplier) {
return this.value != null ? this.value : supplier.get();
}
1
2
3
4
5
// Supplier.java
@FunctionalInterface
public interface Supplier<T> {
T get();
}

Optional 클래스의 orElseGet 함수의 파라미터는 Supplier를 상속받아 구현한 객체를 받고 있으며 Supplier 클래스는 함수가 하나 뿐인 인터페이스로 @FunctionalInterface 어노테이션이 작성돼 있다. 자바에서는 하나의 함수만 존재하는 인터페이스에 한해서 람다(lambda)로 변경할 수 있도록 지원해주고 있으므로 예제와 같이 Funlee::new와 같은 람다 호출이 가능하다.

만약 람다식으로 호출하지 않는다면 다음과 같이 풀어서 작성할 수 있다.

1
2
3
4
5
6
7
8
public Funlee findById(long id) {
return repo.findById(id).orElseGet(new Supplier<Funlee>() {
@Override
public Funlee get() {
return new Funlee();
}
}
}

댓글

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×