반응형
아래 코드에서 httpClient 를 생성하는 로직을 보다가 andThen 과 apply 실행 순서가 헷갈려서 정리했다.
public class ReactorClientHttpConnector implements ClientHttpConnector {
private final static Function<HttpClient, HttpClient> defaultInitializer =
client -> client.compress(true);
public ReactorClientHttpConnector(ReactorResourceFactory factory, Function<HttpClient, HttpClient> mapper) {
ConnectionProvider provider = factory.getConnectionProvider();
this.httpClient = defaultInitializer
.andThen(mapper)
.andThen(applyLoopResources(factory))
.apply(HttpClient.create(provider));
}
}
해당 operator 들에 break point 를 찍고 디버깅해봐도 되지만, 따로 코드를 만들어서 확인했다.
아래 테스트코드를 실행시키면 apply 의 TestFunction.create() 메서드가 제일 먼저 실행된다. 그리고 defaultInitializer, andThen 메서드 순으로 이어진다.
public class Main {
private final static Function<Test, Test> defaultInitializer =
test -> {
System.out.println("second");
test.setVersion(test.getVersion() + 1);
return test;
};
public static void main(String[] args) {
Test result = defaultInitializer
.andThen(test -> {
System.out.println("third");
test.setVersion(test.getVersion() + 1);
return test;
}
)
.andThen(test -> {
System.out.println("forth");
test.setVersion(test.getVersion() + 1);
return test;
})
.apply(Test.create());
System.out.println("result version is 4 : " + result.version);
}
@Getter
@Setter
private static class Test {
private int version = 0;
public static Test create() {
System.out.println("first");
Test test = new Test();
test.setVersion(1);
return test;
}
}
}
체이닝 방식으로, 실행 순서가 직관적으로 위에서 아래로 이어지지 않으므로 주의가 필요하다.
반응형
'Java' 카테고리의 다른 글
자바로 같은 상품 Grouping (0) | 2023.02.05 |
---|---|
index 가 필요해도 자바 고전 for 문 안쓰는 방법 (0) | 2023.01.14 |
함수형 파라미터를 두번 전달하는 이슈 정리 (0) | 2022.01.05 |
날짜 포맷 하위호환(기록용) (0) | 2022.01.04 |
Commands and Events(Design Principles of Reactive Systems) (0) | 2021.12.22 |