실질적으로 이 방법을 찾아보고 적용한 계기는 프로젝트에서 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
lambda를 정의한 후 사용할 메서드에 parameter로 넣는다.
Function<String, String> fn1 = parameter1 -> parameter1 + "blabla"
...
fn2(fn1, parameter2);
넘겨받은 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);
...
위의 String에 대한 명시 말고도 가져와서 사용할 수 있는 Operator도 있다.
추후 사용하게 된다면 더 자세히 알아볼 것 같다.
인터페이스명 | 추상메서드 | 설명 |
---|---|---|
BinaryOperator | BiFunction<T,U,R>의 하위 인터페이스 | T와 U를 연산한 후 R 리턴 |
UnaryOperator | Function<T,R>의 하위 인터페이스 | T를 연산한 후 R 리턴 |
DoubleBinaryOperator | double applyAsDouble(double, double) | 두 개의 double 연산 |
DoubleUnaryOperator | double applyAsDouble(double) | 한 개의 double 연산 |
IntBinaryOperator | int applyAsInt(int,int) | 두 개의 int 연산 |
IntUnaryOperator | int applyAsInt(int) | 한 개의 int 연산 |
LongBinaryOperator | long applyAsLong(long, long) | 두 개의 long 연산 |
LongUnaryOperator | long 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