Item 42. Lambda

읡λͺ… ν΄λž˜μŠ€λ³΄λ‹€λŠ” λžŒλ‹€λ₯Ό μ‚¬μš©ν•˜λΌ

μ˜ˆμ „ μžλ°”μ—μ„œλŠ” ν•¨μˆ˜ νƒ€μž…μ„ ν‘œν˜„ν•  λ•Œ 좔상 λ©”μ„œλ“œλ₯Ό ν•˜λ‚˜λ§Œ 담은 μΈν„°νŽ˜μ΄μŠ€λ‚˜ 좔상 클래슀λ₯Ό μ‚¬μš©ν–ˆλ‹€. μ΄λŸ¬ν•œ μΈν„°νŽ˜μ΄μŠ€μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό ν•¨μˆ˜ 객체라고 ν•˜λ©°, νŠΉμ • ν•¨μˆ˜λ‚˜ λ™μž‘μ„ λ‚˜νƒ€λ‚΄λŠ”λ° μ‚¬μš©ν–ˆλ‹€.

class Main {

    public static void main(String[] args) {
        Collections.sort(words, new Comparator<String>() {
            public int compare(String o1, String o2) {
                return Integer.compare(o1.length(), o2.length());
            }
        });
    }
}

μœ„ μ½”λ“œλŠ” λ¬Έμžμ—΄μ˜ 길이λ₯Ό κΈ°μ€€μœΌλ‘œ μ •λ ¬ν•˜λŠ” μ½”λ“œλ‘œ, κΈ°λŠ₯을 μˆ˜ν–‰ν•˜λŠ” λ°μ—λŠ” λ¬Έμ œκ°€ μ—†μ§€λ§Œ μ½”λ“œκ°€ λ„ˆλ¬΄ κΈΈμ–΄ 가독성이 λ–¨μ–΄μ§€λŠ” 단점이 μžˆλ‹€. 이 단점을 ν•΄μ†Œν•˜κΈ° μœ„ν•΄ μžλ°” 8λΆ€ν„°λŠ” λžŒλ‹€λ₯Ό μ§€μ›ν•˜κ²Œ λ˜λ©΄μ„œ μ½”λ“œλ₯Ό 더 κ°„κ²°ν•˜κ²Œ μž‘μ„±ν•  수 있게 λ˜μ—ˆλ‹€.

class Main {

    public static void main(String[] args) {
        /*
        1. λžŒλ‹€ ν‘œν˜„μ‹
        - 맀개 λ³€μˆ˜μ™€ λ°˜ν™˜ κ°’μ˜ νƒ€μž… μƒλž΅(μ»΄νŒŒμΌλŸ¬κ°€ λ¬Έλ§₯을 μ‚΄νŽ΄ νƒ€μž…μ„ μΆ”λ‘ )
        - return λ¬Έ μƒλž΅(단일 ν‘œν˜„μ‹μ΄λ―€λ‘œ μžλ™μœΌλ‘œ λ°˜ν™˜)
         */
        Collections.sort(words, (o1, o2) -> Integer.compare(o1.length(), o2.length()));
        
        /*
        2. λΉ„κ΅μž 생성 λ©”μ„œλ“œ μ‚¬μš©
         */
        Collections.sort(words, comparingInt(String::length));
        
        /*
        3. List.sort μ‚¬μš©
         */
        words.sort(comparingInt(String::length));
    }
}

ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ 객체λ₯Ό μƒμ„±ν•˜κΈ° 떄문에 이λ₯Ό μ‘μš©ν•˜μ—¬ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€ νƒ€μž…μ„ λ°›λŠ” λͺ¨λ“  κ³³μ—μ„œ λžŒλ‹€λ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.

enum Operation {
    // ν•¨μˆ˜ 객체λ₯Ό μΈμŠ€ν„΄μŠ€ ν•„λ“œμ— μ €μž₯ν•΄ μƒμˆ˜λ³„ λ™μž‘μ„ κ΅¬ν˜„ν•œ μ—΄κ±° νƒ€μž…
    PLUS("+", (x, y) -> x + y),
    MINUS("-", (x, y) -> x - y),
    TIMES("*", (x, y) -> x * y),
    DIVIDE("/", (x, y) -> x / y);

    private final String symbol;
    private final DoubleBinaryOperator op; // ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€ νƒ€μž…μ„ ν•„λ“œλ‘œ μ„ μ–Έ

    Operation(String symbol, DoubleBinaryOperator op) {
        this.symbol = symbol;
        this.op = op;
    }

    public double apply(double x, double y) {
        return op.applyAsDouble(x, y);
    }
}

λžŒλ‹€μ˜ ν•œκ³„

λ©”μ„œλ“œλ‚˜ ν΄λž˜μŠ€μ™€ 달리, λžŒλ‹€λŠ” 이름이 μ—†κ³  λ¬Έμ„œν™”λ₯Ό λͺ» ν•˜κΈ° λ•Œλ¬Έμ— μ½”λ“œ 자체둜 λ™μž‘μ΄ λͺ…ν™•νžˆ μ„€λͺ…λ˜μ§€ μ•ŠλŠ” κ²½μš°κ°€ μžˆλ‹€. λ˜ν•œ 읡λͺ… 클래슀의 thisλŠ” 읡λͺ… 클래슀 μžμ‹ μ„ κ°€λ¦¬ν‚€μ§€λ§Œ, λžŒλ‹€μ˜ thisλŠ” λžŒλ‹€μ‹μ„ 감싼 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό κ°€λ¦¬ν‚€λŠ” 차이가 있기 λ•Œλ¬Έμ— μžμ‹ μ„ μ°Έμ‘°ν•΄μ•Ό ν•œλ‹€λ©΄ 읡λͺ… 클래슀λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 μ’‹λ‹€. λ•Œλ¬Έμ— λžŒλ‹€λ₯Ό μ‚¬μš©ν•˜λŠ” κ²½μš°μ—” μ½”λ“œ μ€„μˆ˜κ°€ μ μ–΄μ„œ κ°„κ²°ν•˜κ²Œ ν‘œν˜„λ  수 μžˆλŠ” κ²½μš°μ—λ§Œ μ‚¬μš©ν•˜λŠ” 것이 μ’‹λ‹€.

Last updated

Was this helpful?