2022. 6. 5. 13:38γJAVA/μλ°μ μ μ
1οΈβ£ λ©μλ μ°Έμ‘°
λλ€μμμ λλ€μμ΄ νλμ λ©μλλ§ νΈμΆνλ κ²½μ°μλ 'λ©μλ μ°Έμ‘°(method reference)'λΌλ λ°©λ²μΌλ‘ λλ€μμ κ°λ΅ν ν μ μλ€.
ν΄λμ€μ΄λ¦::λ©μλμ΄λ¦
-> Function μΈν°νμ΄μ€μ μ§μ λ μ§λ€λ¦ νμ μΌλ‘ λλ€μμ μΌλΆλ₯Ό μΆμΈ‘ν μ μκΈ° λλ¬Έμ μλ΅ν μ μλ€.
μ°Έμ‘°λ³μ fμ νμ λ§ λ΄λ λλ€μμ΄ νκ°μ Stringμ 맀κ°λ³μλ‘ λ°λ κ²μ μ μ μκΈ° λλ¬Έμ λλ€μμ 맀κ°λ³μλ€μ μμ΄λ λλ€.
-> μμ±μλ₯Ό νΈμΆνλ λλ€μλ λ©μλ μ°Έμ‘°λ‘ λ³νν μ μλ€.
-> 맀κ°λ³μκ° μλ μμ±μλΌλ©΄ 맀κ°λ³μμ κ°μμ λ°λΌ μλ§μ ν¨μν μΈν°νμ΄μ€λ₯Ό μ¬μ©νλ©΄ λλ€.
-> λ°°μ΄μ μμ±ν λλ λ©μλ μ°Έμ‘°λ₯Ό μ¬μ©ν κ²μΌλ‘ μ΄κ±° λ§μ΄ μ¬μ©νλ€κ³ νλ€.
2οΈβ£ μ€νΈλ¦Ό (Stream) μ΄λ?
: λ€μν λ°μ΄ν° μμ€λ₯Ό νμ€νλ λ°©λ²μΌλ‘ λ€λ£¨κΈ° μν κ²
μ§κΈκΉμ§ μ°λ¦¬λ μ λ§μ λ°μ΄ν°λ₯Ό λ€λ£¨κΈ° μν΄ μ»¬λ μ μ΄λ λ°°μ΄μ λ°μ΄ν°λ₯Ό λ΄κ³ μνλ κ²°κ³Όλ₯Ό μ»κΈ° μν΄ forλ¬Έμ΄λ iterator μ΄μ©ν΄ μ½λλ₯Ό μμ±νλ€. κ·Έλ¬λ μ΄λ¬ν λ°©μμΌλ‘ μμ±λ μ½λλ μμ보기 μ΄λ ΅κ³ κΈΈλ©°, μ¬μ¬μ©μ±λ λ¨μ΄μ§λ€.
λ λ€λ₯Έ λ¬Έμ λ λ°μ΄ν° μμ€λ§λ€ λ€λ₯Έ λ°©μμΌλ‘ λ€λ€μΌ νλ€λ μ μ΄λ€!
Collectionμ΄λ iteratorμ κ°μ μΈν°νμ΄μ€λ₯Ό μ΄μ©ν΄ 컬λ μ μ λ€λ£¨λ λ°©μμ νμ€ννκΈ°λ νμ§λ§, κ° μ»¬λ μ ν΄λμ€λ κ°μ κΈ°λ₯μ λ©μλλ€μ΄ μ€λ³΅ν΄μ μ μλμ΄ μλ€.
ex) Collecions.sort(), Arrays.sort()
μ΄λ¬ν λ¬Έμ μ λ€μ ν΄κ²°νκΈ° μν΄ λ§λ κ²μ΄ μ€νΈλ¦Όμ΄λ€.
μ€νΈλ¦Όμ λ°μ΄ν°μμ€λ₯Ό μΆμννκ³ λ°μ΄ν°λ₯Ό λ€λ£¨λλ° μμ£Ό μ¬μ©λλ λ©μλλ€μ μ μν΄ λμλ€.
λ°μ΄ν°μμ€λ₯Ό μΆμννμλ€λ κ²μ λ°μ΄ν° μμ€κ° 무μμ΄λ κ°μ κ°μ λ°©μμΌλ‘ λ€λ£° μ μκ² λμλ€λ κ²κ³Ό μ½λμ μ¬μ¬μ©μ±μ΄ λμμ§λ€λ κ²μ μλ―Ένλ€.
μ€νΈλ¦Όμ μ΄μ©νλ©΄ λ°°μ΄μ΄λ 컬λ μ λΏλ§ μλλΌ νμΌμ μ μ₯λ λ°μ΄ν°λ λͺ¨λ κ°μ λ°©μμΌλ‘ λ€λ£° μ μλ€.
- μ€νΈλ¦Ό μ°μ°
: μ€νΈλ¦Όμ΄ μ 곡νλ λ€μν μ°μ°μ μ΄μ©ν΄μ 볡μ‘ν μμ λ€μ κ°λ¨ν μ²λ¦¬ν μ μλ€.
μ€νΈλ¦Όμ΄ μ 곡νλ μ°μ°μ μ€κ° μ°μ°κ³Ό μ΅μ’ μ°μ°μΌλ‘ λΆλ₯ν μ μλλ°, μ€κ° μ°μ°μ μ°μ°κ²°κ³Όλ₯Ό μ€νΈλ¦ΌμΌλ‘ λ°ννκΈ° λλ¬Έμ μ€κ° μ°μ°μ μ°μν΄μ μ°κ²°ν μ μλ€.
μ΅μ’ μ°μ°μ μ€νΈλ¦Όμ μμλ₯Ό μλͺ¨νλ©΄μ μ°μ°μ μννλ―λ‘ λ¨ νλ²λ§ μ°μ°μΈ κ°λ₯νλ€.
3οΈβ£ μ€νΈλ¦Ό νΉμ§
- μ€νΈλ¦Όμ λ°μ΄ν° μμ€λ₯Ό λ³κ²½νμ§ μλλ€. (μλ³Έ λ³κ²½x)
μ€νΈλ¦Όμ λ°μ΄ν° μμ€λ‘λΆν° λ°μ΄ν°λ₯Ό μ½κΈ°λ§ ν λΏ, λ°μ΄ν° μμ€λ₯Ό λ³κ²½νμ§ μλλ€.
- μ€νΈλ¦Όμ μΌνμ©μ΄λ€.
μ€νΈλ¦Όμ iteratorμ²λΌ μΌνμ©μ΄λ€. Iteratorλ‘ μ»¬λ μ μ μμλ₯Ό λͺ¨λ μ½κ³ λλ©΄ λ€μ μ¬μ©ν μ μλ κ² μ²λΌ, μ€νΈλ¦Όλ νλ² μ¬μ©νλ©΄ λ«νμ λ€μ μ¬μ©ν μ μλ€.
- μ€νΈλ¦Όμ μμ μ λ΄λΆ λ°λ³΅μΌλ‘ μ²λ¦¬νλ€.
μ€νΈλ¦Όμ μ΄μ©ν μμ μ΄ κ°κ²°ν μ μλ λΉκ²° μ€ νλκ° λ°λ‘ λ΄λΆ λ°λ³΅μ΄λ€.
λ΄λΆ λ°λ³΅μ΄λΌλ κ²μ λ°λ³΅λ¬Έμ λ©μλ λ΄λΆμ μ¨κΈΈ μ μλ κ²μ μλ―Ένλ€.
-> forEachλ λ©μλ μμΌλ‘ forλ¬Έμ λ£μ κ²μ΄λ€.
- μ§μ°λ μ°μ°
μ€νΈλ¦Ό μ°μ°μμ ν κ°μ§ μ€μν μ μ μ΅μ’ μ°μ°μ΄ μνλκΈ° μ κΉμ§λ μ€κ° μ°μ°μ΄ μνλμ§ μλλ€λ κ²μ΄λ€.
μ€νΈλ¦Όμ λν΄ distinct()λ sort() κ°μ μ€κ° μ°μ°μ νΈμΆν΄λ μ¦κ°μ μΈ μ°μ°μ΄ μνλλ κ²μ΄ μλλΌλ κ²μ΄λ€.
λ¨μ§ μ€κ° μ°μ°μ νΈμΆνλ κ²μ μ΄λ€ μμ μ΄ μνλμ΄μΌ νλμ§ μ§μ ν΄μ£Όλ κ²μΌ λΏμ΄λ€.
μ΅μ’ μ°μ°μ΄ μνλμ΄μΌ λΉλ‘μ μ€νΈλ¦Όμ μμλ€μ΄ μ€κ° μ°μ°μ κ±°μ³ μ΅μ’ μ°μ°μμ μλͺ¨λλ€.
- Stream<Integer> μ IntStream
μμμ νμ μ΄ TμΈ μ€νΈλ¦Όμ κΈ°λ³Έμ μΌλ‘ Stream<T>μ΄μ§λ§, μ€ν λ°μ± & μΈλ°μ±μΌλ‘ μΈν λΉν¨μ¨μ μ€μ΄κΈ° μν΄ λ°μ΄ν° μμ€λ₯Ό κΈ°λ³ΈνμΌλ‘ λ€λ£¨λ μ€νΈλ¦Ό, IntStream, LongStream, DoubleStreamμ΄ μ 곡λλ€.
μΌλ°μ μΌλ‘ Stream<Integer>λμ IntStreamμ μ¬μ©νλ κ²μ΄ λ ν¨μ¨μ μ΄κ³ , IntStreamμλ int νμ μ κ°μΌλ‘ μμ νλλ° μ μ©ν λ©μλλ€μ΄ ν¬ν¨λμ΄ μλ€.
- λ³λ ¬ μ€νΈλ¦Ό
μ€νΈλ¦ΌμΌλ‘ λ°μ΄ν°λ₯Ό λ€λ£° λμ μ₯μ μ€ νλκ° λ°λ‘ λ³λ΄ μ²λ¦¬κ° μ½λ€λ κ²μ΄λ€.
4οΈβ£ μ€νΈλ¦Ό λ§λ€κΈ°
1. μ€νΈλ¦Ό λ§λ€κΈ°
2. μ€κ°μ°μ° (0~ nλ²)
3. μ΅μ’ μ°μ° (0~1λ²)
- 컬λ μ
컬λ μ μ μ΅κ³ μ‘°μ Collectionμ stream()μ΄ μ μλμ΄ μλ€.
λ°λΌμ Collectionμ μμμΈ Listμ Setμ ꡬνν 컬λ μ ν΄λμ€λ€μ λͺ¨λ μ΄ λ©μλλ₯Ό μ€νΈλ¦ΌμΌλ‘ μμ±ν μ μλ€.
stream()μ ν΄λΉ 컬λ μ μ μμ€λ‘ νλ μ€νΈλ¦Όμ λ°ννλ€.
Stream<T> Collection.stream() -> 컬λ μ μ μ€νΈλ¦ΌμΌλ‘ λ³ν
μ΄λ forEach()λ μ€νΈλ¦Όμ μμλ₯Ό μλͺ¨νλ©΄μ μμ μ μννκΈ° λλ¬Έμ κ°μ μ€νΈλ¦Όμ forEach()λ₯Ό λ λ² νΈμΆν μ μλ€.
λ°λΌμ μ€νΈλ¦Όμ μμλ₯Ό ν λ² λ νΈμΆνλ €λ©΄ μ€νΈλ¦Όμ μλ‘ μμ±ν΄μΌνλ€.
βοΈ forEach()μ μν΄ μ€νΈλ¦Όμ μμκ° μλͺ¨λλ κ²μ΄μ§, μμ€μ μμκ° μλͺ¨λλ κ²μ μλκΈ° λλ¬Έμ κ°μ μμ€λ‘λΆν° λ€μ μ€νΈλ¦Όμ μμ±ν μ μλ€.
- λ°°μ΄
λ°°μ΄μ μμ€λ‘ νλ μ€νΈλ¦Όμ μμ±νλ λ©μλλ Streamκ³Ό Arraysμ static λ©μλλ‘ μ μλμ΄ μλ€.
- νΉμ λ²μμ μ μ
IntStreamκ³Ό LongStreamμ μ§μ λ λ²μμ μ°μλ μ μλ₯Ό μ€νΈλ¦ΌμΌλ‘ μμ±ν΄μ λ°ννλ range() μ rangeClosed()λ₯Ό κ°μ§κ³ μλ€.
range()μ κ²½μ° κ²½κ³μ λμΈ endκ° λ²μμ ν¬ν¨λμ§ μκ³ rangeClosed()μ κ²½μ°λ endκ° λ²μμ ν¬ν¨λλ€.
- μμμ μ
λμλ₯Ό μμ±νλλ° μ¬μ©νλ Randomν΄λμ€μλ μΈμ€ν΄μ€ λ©μλλ€μ΄ ν¬ν¨λμ΄ μλ€,
μ΄ λ©μλλ€μ ν΄λΉ νμ μ λμλ€λ‘ μ΄λ£¨μ΄μ§ μ€νΈλ¦Όμ λ°ννλ€.
μ΄ λ©μλλ€μ΄ λ°ννλ μ€νΈλ¦Όμ ν¬κΈ°κ° μ ν΄μ§μ§ μμ 무ν μ€νΈλ¦Όμ΄κΈ° λλ¬Έμ limit()κ³Ό κ°μ΄ μ¬μ©νμ¬ μ€νΈλ¦Όμ ν¬κΈ°λ₯Ό μ νν΄ μ£Όμ΄μΌ νλ€.
βοΈ limit()μ μ€νΈλ¦Όμ κ°μλ₯Ό μ§μ νλλ° μ¬μ©λλ©°, 무ν μ€νΈλ¦Όμ μ ν μ€νΈλ¦ΌμΌλ‘ λ§λ€μ΄μ€λ€.
- λλ€μ iterate(), generate()
Streamν΄λμ€μ iterate()μ generate()λ λλ€μμ 맀κ°λ³μλ‘ λ°μμ, μ΄ λλ€μμ μν΄ κ³μ°λλ κ°λ€μ μμλ‘ νλ 무ν μ€νΈλ¦Όμ μμ±νλ€.
iterate() λ μ¨μκ°(seed)μΌλ‘ μ§μ λ κ°λΆν° μμν΄μ, λλ€μ fμ μν΄μ κ³μ°λ κ²°κ³Όλ₯Ό λ€μ seedκ°μΌλ‘ ν΄μ κ³μ°μ λ°λ³΅νλ€.
generate()λ iterate() μ²λΌ λλ€μμ μν΄ κ³μ°λλ κ°μ μμλ‘ νλ 무ν μ€νΈλ¦Όμ μμ±ν΄μ λ°ννμ§λ§, iterate()μ κ°μ΄ μ΄μ κ²°κ³Όλ₯Ό μ΄μ©ν΄μ λ€μ μμλ₯Ό κ³μ°νμ§ μλλ€.
generate()μ μ μλ 맀κ°λ³μμ νμ μ Supplier<T>μ΄λ―λ‘ λ§€κ°λ³μκ° μλ λλ€μλ§μ νμ©νλ€.
- νμΌ
java.nio.file.Filesλ νμΌμ λ€λ£¨λλ° νμν μ μ©ν λ©μλλ€μ μ 곡νλλ°, list()λ μ§μ λ λλ ν 리(dir)μ μλ νμΌμ λͺ©λ‘μ μμ€λ‘ νλ μ€νΈλ¦Όμ μμ±ν΄μ λ°ννλ€.
lines()λ νμΌμ ν ν(line)μ μμλ‘ νλ μ€νΈλ¦Όμ μμ±νλ λ©μλλ μλ€.
- λΉ μ€νΈλ¦Ό
μμκ° νλλ μλ λΉμ΄μλ μ€νΈλ¦Όμ μμ±ν μλ μλ€.
μ€νΈλ¦Όμ μ°μ°μ μνν κ²°κ³Όκ° νλλ μμ λ nullλ³΄λ€ λΉ μ€νΈλ¦Όμ λ°ννλ κ²μ΄ λ«λ€.
Stream emptyStream = Stream.empty();
long count = emptyStream.count(); // count μ κ°μ 0
count()λ μ€νΈλ¦Όμ μμμ κ°μλ₯Ό λ°ννλ€.