본문 바로가기

Programing/JVM(Java, Kotlin)

[Sonarqube] Functional Interfaces should be as specialised as possible

함수형 인터페이스는 가능하면 스페셜한 놈을 찾아써라...

 

Core Java SE 9 For the impatient (가장 빨리 만나는 코어자바9)책에도 한 페이지지만 분명 언급되어 있었다. (158쪽)

기본 타입 int, long, double에 특화된 함수형 인터페이스 34개...

 

이것을 사용을 하면 오토박싱을 줄일 수 있어서 성능에 향상을 줄 수 있다.

Current Interface Preferred Interface
Function<Integer, R> IntFunction<R>
Function<Long, R> LongFunction<R>
Function<Double, R> DoubleFunction<R>
Function<Double,Integer> DoubleToIntFunction
Function<Double,Long> DoubleToLongFunction
Function<Long,Double> LongToDoubleFunction
Function<Long,Integer> LongToIntFunction
Function<R,Integer> ToIntFunction<R>
Function<R,Long> ToLongFunction<R>
Function<R,Double> ToDoubleFunction<R>
Function<T,T> UnaryOperator<T>
BiFunction<T,T,T> BinaryOperator<T>
Consumer<Integer> IntConsumer
Consumer<Double> DoubleConsumer
Consumer<Long> LongConsumer
BiConsumer<T,Integer> ObjIntConsumer<T>
BiConsumer<T,Long> ObjLongConsumer<T>
BiConsumer<T,Double> ObjDoubleConsumer<T>
Predicate<Integer> IntPredicate
Predicate<Double> DoublePredicate
Predicate<Long> LongPredicate
Supplier<Integer> IntSupplier
Supplier<Double> DoubleSupplier
Supplier<Long> LongSupplier
Supplier<Boolean> BooleanSupplier
UnaryOperator<Integer> IntUnaryOperator
UnaryOperator<Double> DoubleUnaryOperator
UnaryOperator<Long> LongUnaryOperator
BinaryOperator<Integer> IntBinaryOperator
BinaryOperator<Long> LongBinaryOperator
BinaryOperator<Double> DoubleBinaryOperator
Function<T, Boolean> Predicate<T>
BiFunction<T,U,Boolean> BiPredicate<T,U>

따라서 이전에 쓰였던 https://namocom.tistory.com/771의 경우 성능하고는 상관은 의미상으로 UnaryOperator로 바꾸라는 것 같다.

사실, UnaryOperator는 Function 인터페이스를 상속한다.

UnaryOperator는 Function을 상속하므로 apply를 적용할 수 있다.

Function<String, String> transformer

UnaryOperator<String> transformer

로 바꾸면 된다.

프랙티스

몇 번 경험을 해보니

Function<T, R> 의 경우 입력과 반환이 같은 경우에는 (Function<T, T>) UnarayOperator<T>로 바꿀 수 있고,

반환타입이 필요없는 UnaryOperator<T>의 경우에는 Consumer<T>로 바꿀 수 있었다.

(위에서 반환타입이 필요없는 이유는 입력으로 받는 인자를 그대로 return해주는 경우였다.)