곡λΆνλ€κ° λλ€μμ΄λ μ€νΈλ¦Ό λμμ μ 리ν κ²Έ μ μ΄λ³Έλ€
λλ€μμ΄λ?
JAVA 8λΆν° μΆκ°λ νν λ°©μ μ€ νλλ‘ ν¨μν ννλ°©μμ΄λ€. λ©μλλ₯Ό νλμ κ°κ²°ν μμΌλ‘ ννν κ²μ΄λ€.
λ©μλλ₯Ό λλ€μμΌλ‘ νννλ©΄ λ©μλμ μ΄λ¦κ³Ό λ°νκ°μ΄ μμ΄μ§λ―λ‘ 'μ΅λͺ ν¨μ'λΌκ³ λ νλ€.
κΈ°μ‘΄ μλ° λ¬Έλ²
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("This is not lambda");
}
})
λλ€μ λ¬Έλ²
new Thread(()->{
System.out.println("This is lambda");
}
μ΄λ¬ν λλ€ ννμμ λ©μλμ 맀κ°λ³μλ‘ μ λ¬λ μλ μμΌλ©°, λ©μλμ κ²°κ΄κ°μΌλ‘ λ°νλ μλ μλ€.
λ°λΌμ ν¨μν νλ‘κ·Έλλ°μΈ λλ€ ννμμ μ¬μ©νλ©΄ μ½λκ° κ°κ²°ν΄μ§κ³ κ°λ μ±μ΄ μ’μμ§λ€.
λλ€ ννμ μμ±
μλ°μμλ νμ΄ν(->) κΈ°νΈλ₯Ό μ¬μ©νμ¬ λλ€ ννμμ μμ±νλ€.
(맀κ°λ³μ λͺ©λ‘) -> { ν¨μ λͺΈμ²΄ }
ν¨μν μΈν°νμ΄μ€(functional interface)
λλ€ ννμμ μ¬μ©ν λλ λλ€ ννμμ μ μ₯νκΈ° μν μ°Έμ‘° λ³μμ νμ μ κ²°μ ν΄μΌλ§ νλ€.
μ°Έμ‘°λ³μνμ μ°Έμ‘°λ³μμ΄λ¦ = λλ€ ννμ
μμ λ¬Έλ²μ²λΌ λλ€ ννμμ νλμ λ³μμ λμ ν λ μ¬μ©νλ μ°Έμ‘° λ³μμ νμ μ ν¨μν μΈν°νμ΄μ€λΌκ³ νλ€.
ν¨μν μΈν°νμ΄μ€λ μΆμ ν΄λμ€μλ λ¬λ¦¬ λ¨ νλμ μΆμ λ©μλλ§μ κ°μ ΈμΌ νλ€.
λν @FunctionalInterface μ΄λ Έν μ΄μ μ μ¬μ©νμ¬ ν¨μν μΈν°νμ΄μ€μμ λͺ μν μ μλ€. (μ»΄νμΌλ¬κ° ν΄λΉ μΈν°νμ΄μ€λ₯Ό ν¨μν μΈν°νμ΄μ€λ‘ μΈμ)
μλ° μ»΄νμΌλ¬λ μ΄λ κ² λͺ μλ ν¨μν μΈν°νμ΄μ€μ λ κ° μ΄μμ λ©μλκ° μ μΈλλ©΄ μ€λ₯λ₯Ό λ°μμν¨λ€.
Stream API
JAVAμ Streamμ 컬λ μ (collection)μ μμλ₯Ό νλμ© μ°Έμ‘°νμ¬ ν¨μν μΈν°νμ΄μ€(λλ€μ)μΌλ‘ μ²λ¦¬ν μ μλλ‘ ν΄μ£Όλ μΌμ’ μ λ°λ³΅μμ΄λ€.
μλ°μμ μ°μ΄λ μ μΆλ ₯ μ€νΈλ¦Όκ³Όλ κ΄λ ¨ μλ€
(inputStreamμ java.io ν¨ν€μ§ / Streamμ java.util ν¨ν€μ§)
μ€νΈλ¦Ό APIμ λμ νλ¦
01. μ€νΈλ¦Ό μμ±
02. μ€κ° μ°μ°(μ€νΈλ¦Όμ λ³ν)
03. μ΅μ’ μ°μ°(μ€νΈλ¦Όμ μ¬μ©)
μ΄ ν¬μ€νΈμμλ μ£Όλ‘ μ¬μ©νλ κ²μ μ€κ° μ°μ°μ λν΄μλ§ μκ°νκ² λ€
μ€νΈλ¦Όμ μ€κ° μ°μ°(intermediate operation)
μ€νΈλ¦Ό APIμ μν΄ μμ±λ μ΄κΈ° μ€νΈλ¦Όμ μ€κ° μ°μ°μ ν΅ν΄ λ λ€λ₯Έ μ€νΈλ¦ΌμΌλ‘ λ³νλλ€(μ°μ μ¬μ© κ°λ₯)
μ€νΈλ¦Όμ μ€κ° μ°μ°μ filter-map κΈ°λ°μ APIλ₯Ό μ¬μ©νλ€.
λνμ μΈ μ€κ° μ°μ°κ³Ό λ©μλ
1. μ€νΈλ¦Ό νν°λ§ : filter(), distinct()
- filter : ν΄λΉ μ€νΈλ¦Όμμ μ£Όμ΄μ§ 쑰건μ λ§λ μμλ§μΌλ‘ ꡬμ±λ μλ‘μ΄ μ€νΈλ¦Όμ λ°ν
IntStream stream = IntStream.of(7, 5, 5, 2, 1, 2, 3, 5, 4, 6);
// μ€νΈλ¦Όμμ νμλ§μ 골λΌλ
stream.filter(n -> n % 2 != 0).forEach(e -> System.out.print(e + " "));
- distinct : ν΄λΉ μ€νΈλ¦Όμμ μ€λ³΅λ μμκ° μ κ±°λ μλ‘μ΄ μ€νΈλ¦Όμ λ°ν. (λ΄λΆμ μΌλ‘ Object ν΄λμ€μ equals() λ©μλλ₯Ό μ¬μ©νμ¬ μμμ μ€λ³΅μ λΉκ΅νλ€)
// μ€νΈλ¦Όμμ μ€λ³΅λ μμλ₯Ό μ κ±°ν¨.
stream.distinct().forEach(e -> System.out.print(e + " "));
2. μ€νΈλ¦Ό λ³ν : map(), flatMap()
- map : ν΄λΉ μ€νΈλ¦Όμ μμλ€μ μ£Όμ΄μ§ ν¨μμ μΈμλ‘ μ λ¬νμ¬, κ·Έ λ°νκ°λ€λ‘ μ΄λ£¨μ΄μ§ μλ‘μ΄ μ€νΈλ¦Όμ λ°ν
- flatMap(μ€νΈλ¦Ό μμκ° λ°°μ΄μΌ λ) : κ° λ°°μ΄μ κ° μμμ λ°νκ°μ νλλ‘ ν©μΉ μλ‘μ΄ μ€νΈλ¦Όμ λ°ν
3. μ€νΈλ¦Ό μ ν : limit(), skip()
- limit : ν΄λΉ μ€νΈλ¦Όμ 첫 λ²μ§Έ μμλΆν° μ λ¬λ κ°μλ§νΌμ μμλ§μΌλ‘ μ΄λ£¨μ΄μ§ μλ‘μ΄ μ€νΈλ¦Όμ λ°ν
- skip : ν΄λΉ μ€νΈλ¦Όμ 첫 λ²μ§Έ μμλΆν° μ λ¬λ κ°μλ§νΌμ μμλ₯Ό μ μΈν λλ¨Έμ§ μμλ§μΌλ‘ μ΄λ£¨μ΄μ§ μλ‘μ΄ μ€νΈλ¦Όμ λ°ν
4. μ€νΈλ¦Ό μ λ ¬ : sorted()
- sorted : ν΄λΉ μ€νΈλ¦Όμ μ£Όμ΄μ§ λΉκ΅μ(comparator)λ₯Ό μ΄μ©νμ¬ μ λ ¬.(default : μνλ²³ μ)
5. μ€νΈλ¦Ό μ°μ° κ²°κ³Ό νμΈ : peek()
- peak : κ²°κ³Ό μ€νΈλ¦ΌμΌλ‘λΆν° μμλ₯Ό μλͺ¨νμ¬ μΆκ°λ‘ λͺ μλ λμμ μν. μ£Όλ‘ λλ²κΉ μ©
λκΈ