lambda를 parameter로 넘기는 방법

leverest96·2022년 12월 7일
0

Spring / Java

목록 보기
3/20
post-thumbnail

1. Function<T, T>

실질적으로 이 방법을 찾아보고 적용한 계기는 프로젝트에서 file의 name을 설정할 때, 각 Service에서 큰 틀을 만들고 manager에서 file들에 대한 확장자나 파일 이름을 적용시키기 위함이었다.

Example of file name : {uuid}/profile/picture.png
  1. uuid : service의 parameter
  2. /profile/picture : string
  3. .png : 이후 manager에서 판단될 확장자

따라서 사실상 내가 필요했던 것은 parameter로 메서드 혹은 람다를 넘기는 방법이었고 제목이었기 때문에 String의 조합인 Function<String, String> 방법을 사용했다.

  • Example

    1. lambda를 정의한 후 사용할 메서드에 parameter로 넣는다.

      Function<String, String> fn1 = parameter1 -> parameter1 + "blabla"
      
       ...
      
       fn2(fn1, parameter2);
    2. 넘겨받은 lambda를 불러내어 필요한 정보를 apply한다.

      ... fn1.apply(developedParameter2);

실질적으로 내가 사용한 코드!

1. service

	...

	Function<String, String> titleGenerator = (originalFileName) -> uuid + "/profile/picture" + FileExtensionGenerator.getFileExtension(originalFileName);
	return awsS3Manager.uploadFiles(titleGenerator, multipartFiles);

	...

2. manager

	public List<String> uploadFiles(final Function<String, String> titleGenerator, final List<MultipartFile> multipartFile) {

	...

      final String originalFileName = file.getOriginalFilename();
      final String fileName = titleGenerator.apply(originalFileName);

	...


2. Operator 함수적 인터페이스

위의 String에 대한 명시 말고도 가져와서 사용할 수 있는 Operator도 있다.
추후 사용하게 된다면 더 자세히 알아볼 것 같다.

인터페이스명추상메서드설명
BinaryOperatorBiFunction<T,U,R>의 하위 인터페이스T와 U를 연산한 후 R 리턴
UnaryOperatorFunction<T,R>의 하위 인터페이스T를 연산한 후 R 리턴
DoubleBinaryOperatordouble applyAsDouble(double, double)두 개의 double 연산
DoubleUnaryOperatordouble applyAsDouble(double)한 개의 double 연산
IntBinaryOperatorint applyAsInt(int,int)두 개의 int 연산
IntUnaryOperatorint applyAsInt(int)한 개의 int 연산
LongBinaryOperatorlong applyAsLong(long, long)두 개의 long 연산
LongUnaryOperatorlong applyAsLong(long)한 개의 long 연산

https://www.baeldung.com/java-8-lambda-expressions-tips
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=rain483&logNo=220597200692

profile
응애 난 애기 개발자

0개의 댓글