작성
·
200
0
안녕하세요
람다식은 인터페이스안에 구현해야할 메소드가 하나만 있을때 사용 가능한것으로 알고있는데
completable.subscribeOn(Schedulers.computation())
.subscribe(new CompletableObserver() {
@Override
public void onSubscribe(Disposable disposable) {
// 아무것도 하지 않음
}
@Override
public void onComplete() {
Logger.log(LogType.ON_COMPLETE);
}
@Override
public void onError(Throwable error) {
Logger.log(LogType.ON_ERROR, error);
}
});
여기서 CompletableObserver 는 오버라이드 해야할 메소드가 3개나 있는데 어떤 원리로
completable.subscribeOn(Schedulers.computation())
.subscribe(
() -> Logger.log(LogType.ON_COMPLETE),
error -> Logger.log(LogType.ON_ERROR, error)
);
이런식으로 람다표현이 가능한건가요?
답변 1
0
안녕하세요?
아래 캡쳐 이미지에 있는 코드는 Completable 추상 클래스의 내부 코드 중 일부인데요.
파라미터로 CompletableObserver를 전달 받습니다.
아래 캡쳐 이미지 역시 Completable 추상 클래스의 내부 코드 중 일부이고,
파라미터로 두 개의 람다 표현식을 전달 받습니다.
즉, 파라미터가 다른 subscribe() 메서드가 Complatable 클래스 내부에 구현되어 있습니다.
첫번째 캡처 이미지에서는 파라미터로 전달 받은 CompletableObserver를 subscribeActual(observer)을 호출할 때 전달합니다. 두번째 캡쳐 이미지에서는 CallbackCompletableObserver의 생성자 파라미터로 람다를 전달한 후에 subscribe(observer)로 호출하는데 이렇게 호출하면 결국 내부에서 subscribeActual(observer)을 다시 호출합니다.
즉, CompletableObserver 인터페이스를 구현하는 클래스 내부에서 람다 표현식을 전달 받아서 사용할 수도 있고, 그렇지 않을 수도 있다라고 생각해 주시면 될 것 같습니다.