본문 바로가기
Java

자바 Function.andThen 과 apply 작동 순서

by ybs 2022. 8. 30.
반응형

아래 코드에서 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;
		}
	}
}

 

 

체이닝 방식으로, 실행 순서가 직관적으로 위에서 아래로 이어지지 않으므로 주의가 필요하다.

반응형