Item 44. Functional Interface

ν‘œμ€€ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜λΌ

μžλ°”κ°€ λžŒλ‹€λ₯Ό μ§€μ›ν•˜κ²Œ λ˜λ©΄μ„œ ν•¨μˆ˜ 객체λ₯Ό λ°›λŠ” λ©”μ„œλ“œλ‚˜ μƒμ„±μžλ₯Ό μž‘μ„±ν•  수 있게 λ˜μ—ˆλ‹€. ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ₯Ό 직접 κ΅¬ν˜„ν•  μˆ˜λ„ μžˆμ§€λ§Œ 이미 μžλ°”λŠ” ν‘œμ€€ API둜 java.util.function νŒ¨ν‚€μ§€μ— μžˆλŠ” ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜λŠ” 것을 ꢌμž₯ν•œλ‹€.

  • java.util.function νŒ¨ν‚€μ§€μ˜ κΈ°λ³Έ μΈν„°νŽ˜μ΄μŠ€ 6가지

μΈν„°νŽ˜μ΄μŠ€ν•¨μˆ˜ μ‹œκ·Έλ‹ˆμ²˜μ˜ˆμ‹œμ„€λͺ…

UnaryOperator

T apply(T t)

String::toLowerCase

인수(1개)와 λ°˜ν™˜κ°’μ˜ νƒ€μž…μ΄ 같은 ν•¨μˆ˜

BinaryOperator

T apply(T t1, T t2)

BigInteger::add

인수(2개)와 λ°˜ν™˜κ°’μ˜ νƒ€μž…μ΄ 같은 ν•¨μˆ˜

Predicate

boolean test(T t)

Collection::isEmpty

인수λ₯Ό λ°›μ•„ boolean을 λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜

Function<T, R>

R apply(T t)

Arrays::asList

μΈμˆ˜μ™€ λ°˜ν™˜κ°’μ˜ νƒ€μž…μ΄ λ‹€λ₯Έ ν•¨μˆ˜

Supplier

T get()

Instant::now

인수λ₯Ό 받지 μ•Šκ³  값을 λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜

Consumer

void accept(T t)

System.out::println

인수λ₯Ό ν•˜λ‚˜ λ°›κ³  λ°˜ν™˜κ°’ 없이 인수λ₯Ό μ†ŒλΉ„ν•˜λŠ” ν•¨μˆ˜

λͺ¨λ“  κΈ°λ³Έ μΈν„°νŽ˜μ΄μŠ€λŠ” κΈ°λ³Έ νƒ€μž…μΈ int, long, double을 각각 λ°›λŠ” λ³€ν˜• μΈν„°νŽ˜μ΄μŠ€ 3κ°œμ”© μ œκ³΅ν•˜κ²Œ 되고, κ·Έ 외에 λ‹€μ–‘ν•œ λ³€ν˜• μΈν„°νŽ˜μ΄μŠ€λ„ μ œκ³΅ν•˜κ³  μžˆλ‹€. (총 43κ°œμ§€λ§Œ, κ·œμΉ™μ„±μ΄ λΆ€μ‘±ν•˜κΈ° λ•Œλ¬Έμ— ν•„μš”ν•  λ•Œ μ°Ύμ•„ μ‚¬μš©ν•˜λŠ” 것이 μ’‹λ‹€.)

λ§Žμ€ 수의 μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ§€μ›ν•˜κΈ° λ•Œλ¬Έμ— λŒ€λΆ€λΆ„ μƒν™©μ—μ„œλŠ” ν‘œμ€€ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜κ³ , μ—†λŠ” κ²½μš°μ—λ§Œ 직접 κ΅¬ν˜„ν•˜λŠ” 것이 μ’‹λ‹€.

ν‘œμ€€ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 경우

이미 λ˜‘κ°™μ€ μ‹œκ·Έλ‹ˆμ²˜λ₯Ό κ°–λŠ” μΈν„°νŽ˜μ΄μŠ€κ°€ μ‘΄μž¬ν•˜κ³  μžˆμŒμ—λ„ λΆˆκ΅¬ν•˜κ³ , μ‚¬μš©ν•˜μ§€ μ•Šκ³  λ³„λ„μ˜ μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ§Œλ“€μ–΄ μ‚¬μš©ν•˜λŠ” κ²½μš°κ°€ μžˆλ‹€. κ·Έ μ˜ˆμ‹œλŠ” Comparator<T>와 ToIntBiFunction<T, U>둜, λ‘˜μ΄ ꡬ쑰적으둜 λ™μΌν•œ 역할을 ν•˜μ§€λ§Œ Comparatorλ₯Ό λ…μžμ μΈ μΈν„°νŽ˜μ΄μŠ€λ‘œ μ‚¬μš©ν•˜λŠ” 것이 μΌλ°˜μ μ΄λ‹€.

  1. 자주 μ“°μ΄λ©΄μ„œ, 이름 μžμ²΄κ°€ μš©λ„λ₯Ό λͺ…ν™•ν•˜κ²Œ μ„€λͺ…ν•΄μ€Œ

  2. κ΅¬ν˜„ν•˜λŠ” μͺ½μ—μ„œ μ§€μΌœμ•Ό ν•  κ·œμ•½μ΄ λͺ…ν™•ν•˜κ²Œ μ •μ˜λ˜μ–΄ 있음

  3. λΉ„κ΅μžλ“€μ„ λ³€ν™˜ν•˜κ³  μ‘°ν•©ν•  수 μžˆλŠ” μœ μš©ν•œ λ©”μ„œλ“œλ“€μ„ μ œκ³΅ν•¨

λ§Œμ•½ μœ„μ˜ λ‚΄μš© 쀑 ν•˜λ‚˜ 이상을 λ§Œμ‘±ν•œλ‹€λ©΄ ν‘œμ€€ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€κ°€ μ•„λ‹Œ μ „μš© ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λŠ” 것도 쒋은 방법이 될 수 μžˆλ‹€.(κ΅¬ν˜„ν•  땐 @FunctionalInterface μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•˜μž)

ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€ μ‚¬μš©μ‹œ 주의점

μ„œλ‘œ λ‹€λ₯Έ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ₯Ό 같은 μœ„μΉ˜μ˜ 인수둜 λ°›κ²Œ λ˜λŠ” λ©”μ„œλ“œλ₯Ό 닀쀑 μ •μ˜ν•΄μ„œλŠ” μ•ˆλœλ‹€.

public interface ExecutorService extends Executor {
    // ...

    <T> Future<T> submit(Callable<T> task);

    Future<?> submit(Runnable task);

    // ...
}

μ΄λ ‡κ²Œ 되면 ν΄λΌμ΄μ–ΈνŠΈμ—μ„  μ˜¬λ°”λ₯Έ λ©”μ„œλ“œ μ‚¬μš©μ„ ν•˜κΈ° μœ„ν•΄ ν˜•λ³€ν™˜μ„ ν•΄μ•Όν•˜κΈ° λ•Œλ¬Έμ—, μ΄λŠ” ν”Όν•˜λŠ” 것이 μ’‹λ‹€.

class Main {
    public static void main(String[] args) {

        ExecutorService exec = Executors.newCachedThreadPool();
        exec.submit(() -> System.out.println("Hello")); // μ–΄λ–€ 것이 호좜 λ˜λŠ”μ§€ λͺ¨ν˜Έν•¨
        // ν˜•λ³€ν™˜μ„ 톡해 λͺ…μ‹œμ μœΌλ‘œ μ–΄λ–€ 것을 ν˜ΈμΆœν•  것인지 λͺ…μ‹œν•  수 있음
        exec.submit((Callable<Void>) () -> {
            System.out.println("Hello");
            return null;
        });
    }
}

Last updated