Post

[Java] λžŒλ‹€μ‹(Lambda)

πŸ“Œ λ“€μ–΄κ°€λ©°

Java 8μ—μ„œ λ„μž…λœ λžŒλ‹€μ‹μ€ μžλ°” ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„μ„ 크게 λ°”κΎΌ κΈ°λŠ₯이닀. μž₯ν™©ν•˜λ˜ 읡λͺ… 클래슀λ₯Ό ν•œ μ€„λ‘œ 쀄여주고, ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ˜ ν‘œν˜„λ ₯을 μžλ°”μ— λ“€μ—¬μ™”λ‹€. 이번 κΈ€μ—μ„œλŠ” λžŒλ‹€μ‹μ˜ κΈ°λ³Έ κ°œλ…, ν™œμš©, μ£Όμ˜μ‚¬ν•­μ„ μ •λ¦¬ν•œλ‹€.

λžŒλ‹€μ‹μ΄λž€? 읡λͺ… ν•¨μˆ˜μ˜ ν˜•νƒœλ₯Ό κ°–λŠ” μžλ°”μ˜ ν‘œν˜„ 방식. 주둜 ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€(좔상 λ©”μ†Œλ“œκ°€ λ”± ν•˜λ‚˜μΈ μΈν„°νŽ˜μ΄μŠ€)λ₯Ό κ΅¬ν˜„ν•  λ•Œ μ‚¬μš©ν•΄, μ½”λ“œλ₯Ό κ°„κ²°ν•˜κ²Œ λ§Œλ“ λ‹€.


1. κΈ°λ³Έ 문법

읡λͺ… ν΄λž˜μŠ€μ™€ λΉ„κ΅ν•˜λ©΄ λžŒλ‹€μ‹μ˜ 간결함이 ν•œλˆˆμ— 보인닀.

1
2
3
4
5
6
7
8
9
10
// 기쑴의 읡λͺ… 클래슀
Runnable runnable1 = new Runnable() {
    @Override
    public void run() {
        System.out.println("Hello, World!");
    }
};

// λžŒλ‹€μ‹
Runnable runnable2 = () -> System.out.println("Hello, World!");

λ§€κ°œλ³€μˆ˜μ™€ λ°˜ν™˜κ°’μ΄ μžˆμ„ λ•Œλ„ λ§ˆμ°¬κ°€μ§€λ‹€. λžŒλ‹€μ‹μ€ νƒ€μž…μ„ μΆ”λ‘ ν•˜λ―€λ‘œ λ§€κ°œλ³€μˆ˜ νƒ€μž…μ„ μƒλž΅ν•  수 μžˆλ‹€.

1
2
3
4
5
6
7
8
9
10
// 읡λͺ… 클래슀
Comparator<Integer> comparator1 = new Comparator<Integer>() {
    @Override
    public int compare(Integer o1, Integer o2) {
        return o1.compareTo(o2);
    }
};

// λžŒλ‹€μ‹ (νƒ€μž… μΆ”λ‘ )
Comparator<Integer> comparator2 = (o1, o2) -> o1.compareTo(o2);
1
2
3
4
5
6
읡λͺ… 클래슀 (μ—¬λŸ¬ 쀄)          λžŒλ‹€μ‹ (ν•œ 쀄)
new Runnable() {              () -> System.out.println("Hi")
    public void run() {  ──►
        ...
    }
}

2. λžŒλ‹€μ‹μ˜ ν™œμš©

ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€μ™€μ˜ κ²°ν•©

λžŒλ‹€μ‹μ€ 좔상 λ©”μ†Œλ“œκ°€ ν•˜λ‚˜λΏμΈ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•  λ•Œ 빛을 λ°œν•œλ‹€.

1
2
3
4
5
6
7
8
@FunctionalInterface
interface MyFunction {
    int calculate(int a, int b);
}

// ν•˜λ‚˜μ˜ μΈν„°νŽ˜μ΄μŠ€λ‘œ λ‹€μ–‘ν•œ λ™μž‘μ„ ν‘œν˜„
MyFunction add      = (a, b) -> a + b;
MyFunction subtract = (a, b) -> a - b;

μ»¬λ ‰μ…˜ 처리

λ°˜λ³΅λ¬Έλ„ κ°„κ²°ν•˜κ²Œ ν‘œν˜„λœλ‹€.

1
2
3
4
5
6
7
8
9
List<String> languages = Arrays.asList("Java", "Python", "JavaScript", "Kotlin");

// κΈ°μ‘΄ 방식
for (String language : languages) {
    System.out.println(language);
}

// λžŒλ‹€μ‹
languages.forEach(language -> System.out.println(language));

⚠️ λžŒλ‹€μ‹μ˜ μ£Όμ˜μ‚¬ν•­

ν•­λͺ©μ£Όμ˜μ 
ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€ μ—¬λΆ€λžŒλ‹€ λŒ€μƒμ€ 좔상 λ©”μ†Œλ“œκ°€ ν•˜λ‚˜λΏμΈ μΈν„°νŽ˜μ΄μŠ€μ—¬μ•Ό 함
λ³€μˆ˜μ˜ final μ—¬λΆ€μ™ΈλΆ€ λ³€μˆ˜ μ‚¬μš© μ‹œ final λ˜λŠ” effectively final이어야 함
this ν‚€μ›Œλ“œλžŒλ‹€ λ‚΄λΆ€μ˜ thisλŠ” λžŒλ‹€κ°€ μ •μ˜λœ 객체λ₯Ό 가리킴 (읡λͺ… ν΄λž˜μŠ€μ™€ 닀름)
μ˜ˆμ™Έ μ²˜λ¦¬λžŒλ‹€ λ‚΄λΆ€μ—μ„œ λ°œμƒν•œ μ˜ˆμ™ΈλŠ” ν˜ΈμΆœν•˜λŠ” κ³³μ—μ„œ 처리 ν•„μš”

πŸ“Œ ν•¨κ»˜ μ•Œμ•„λ‘λ©΄ 쒋은 팁

β‘  λ©”μ†Œλ“œ 레퍼런슀

이미 μ •μ˜λœ λ©”μ†Œλ“œλ₯Ό μ°Έμ‘°ν•˜λ©΄ λžŒλ‹€λ₯Ό 더 κ°„κ²°ν•˜κ²Œ μ“Έ 수 μžˆλ‹€.

1
2
Consumer<String> printer1 = s -> System.out.println(s);   // λžŒλ‹€μ‹
Consumer<String> printer2 = System.out::println;          // λ©”μ†Œλ“œ 레퍼런슀

β‘‘ Optional과의 κ²°ν•©

값이 μžˆμ„ μˆ˜λ„ 없을 μˆ˜λ„ μžˆλŠ” 상황을 λžŒλ‹€μ™€ ν•¨κ»˜ μ•ˆμ „ν•˜κ²Œ 닀룬닀.

1
2
3
4
Optional<String> nullableValue = Optional.ofNullable(getNullableValue());

nullableValue.ifPresent(value -> System.out.println("Value: " + value));
String result = nullableValue.orElse("Default Value");

β‘’ Stream API

μ»¬λ ‰μ…˜ 처리λ₯Ό ν•„ν„° β†’ λ³€ν™˜ β†’ μ†ŒλΉ„μ˜ νŒŒμ΄ν”„λΌμΈμœΌλ‘œ ν‘œν˜„ν•œλ‹€.

1
2
3
4
5
List<String> words = Arrays.asList("Apple", "Banana", "Orange", "Grapes");

words.stream()
     .filter(word -> word.startsWith("A"))   // A둜 μ‹œμž‘ν•˜λŠ” κ²ƒλ§Œ
     .forEach(System.out::println);          // 좜λ ₯

πŸ“ 정리

1
2
3
4
5
6
λžŒλ‹€μ‹(Lambda) β€” Java 8+
β”œβ”€ 문법      (λ§€κ°œλ³€μˆ˜) -> { 본체 }   읡λͺ… 클래슀의 μΆ•μ•½
β”œβ”€ λŒ€μƒ      ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€(좔상 λ©”μ†Œλ“œ 1개)
β”œβ”€ ν™œμš©      μ»¬λ ‰μ…˜ forEach, Comparator, Stream λ“±
β”œβ”€ 주의      effectively final, this, μ˜ˆμ™Έ 처리
└─ ν™•μž₯      λ©”μ†Œλ“œ 레퍼런슀(::) Β· Optional Β· Stream API
κ°œλ…ν•œ 쀄 μ •μ˜
λžŒλ‹€μ‹ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λŠ” 읡λͺ… ν•¨μˆ˜
ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€μΆ”μƒ λ©”μ†Œλ“œκ°€ ν•˜λ‚˜λΏμΈ μΈν„°νŽ˜μ΄μŠ€
λ©”μ†Œλ“œ 레퍼런슀Class::method둜 λžŒλ‹€λ₯Ό 더 μΆ•μ•½
Stream APIμ»¬λ ‰μ…˜μ„ νŒŒμ΄ν”„λΌμΈμœΌλ‘œ 처리

λžŒλ‹€μ‹μ€ β€œλ™μž‘(μ½”λ“œ)을 κ°’μ²˜λŸΌ 전달”할 수 있게 ν•΄μ£ΌλŠ” 도ꡬ닀. ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€Β·λ©”μ†Œλ“œ 레퍼런슀·Stream API와 κ²°ν•©ν•˜λ©΄, μžλ°” μ½”λ“œλ₯Ό 훨씬 κ°„κ²°ν•˜κ³  μ„ μ–Έμ μœΌλ‘œ μž‘μ„±ν•  수 μžˆλ‹€.

This post is licensed under CC BY 4.0 by the author.

Comments powered by Disqus.