
Chapter 14 - λλ€μ μ€νΈλ¦Ό
1. λλ€μ
- JDK 1.8λΆν° μΆκ°
- ν¨μν μΈμ΄μ κΈ°λ₯κΉμ§ κ°μΆκ² ν¨
- ν¨μν μΈμ΄μ μ₯μ λ€μ μλ°μμλ μ¬μ©
1.1 λλ€μμ΄λ?
λ©μλλ₯Ό νλμ μ(expression)μΌλ‘ ννν κ²
- κ°λ΅ & λͺ νν μμΌλ‘ ν¨μλ₯Ό νν
- λ©μλμ μ΄λ¦κ³Ό λ°νκ°μ΄ μμ΄μ§λ―λ‘
μ΅λͺ ν¨μ
λΌκ³ λ λΆλ¦ - λ©μλλ κ°μ²΄μ§ν₯μμμ ν¨μ (κ°μ²΄μ νμλ λμμ μλ―Έ)
1.2 λλ€μ μμ±νκΈ°
- μ΄λ¦κ³Ό λ°ν νμ
μ μ κ±°νκ³ λ§€κ°λ³μ μ μΈλΆμ λͺΈν΅ μ¬μ΄μ
->
μΆκ°- λ°νκ°μ΄ μλ€λ©΄ returnλ¬Έμ μμΌλ‘ λμ ν μ μμ(λμ μΈλ―Έμ½λ‘ μ λΆμ΄μ§ μμ)
- 맀κ°λ³μ νμ μ μΆλ‘ μ΄ κ°λ₯ν κ²½μ° μλ΅ (맀κ°λ³μ μ€ μ΄λ νλμ 맀κ°λ³μλ§ μλ΅μ λΆκ°λ₯)
- 맀κ°λ³μκ° νλλΏμ΄κ³ λ§€κ° λ³μμ νμ μ΄ μμ μ κ²½μ°μ κ΄νΈ μλ΅ κ°λ₯
- κ΄νΈ {}μμ λ¬Έμ₯μ΄ νλμΌ λλ κ΄νΈ μλ΅ κ°λ₯, μ΄λλ λμ μΈλ―Έμ½λ‘ μ λΆμ΄μ§ μμμΌ νλ€.
1.3 ν¨μν μΈν°νμ΄μ€(Functional Interface)
- λλ€μμ μ΅λͺ ν΄λμ€μ κ°μ²΄μ λλ± (new Object() {~})
- λλ€λ‘ μ μλ λ©μλλ₯Ό νΈμΆν λ νμν κ²λ€
- μ°Έμ‘° λ³μκ° νμ
- μ°Έμ‘° λ³μλ₯Ό λ§λ€κΈ° μν΄μλ μ°Έμ‘° λ³μμ νμ μ΄ νμ
- λλ€μκ³Ό λλ±ν λ©μλλ₯Ό μ μν μΈν°νμ΄μ€λ₯Ό λ§λ λ€ μ°Έμ‘° λ³μμ νμ μΌλ‘ μ§μ
- μΈν°νμ΄μ€λ₯Ό ꡬνν ν΄λμ€λ₯Ό
'new νμ '
κ³Ό κ°μ λ°©μμΌλ‘ ꡬνν μ μμ§λ§ λλ€μμΌλ‘λ ꡬν κ°λ₯ - (μ°Έμ‘° λ³μ).(μΈν°νμ΄μ€μ μ μλ λ©μλλͺ )μΌλ‘ μ΅λͺ κ°μ²΄μ λ©μλ νΈμΆ
- μμ κ°μ κ³Όμ μΌλ‘ μΈν΄ μΈν°νμ΄μ€λ‘ λλ€μμ λ€λ£¨κΈ°λ‘ κ²°μ
- λλ€μμ λ€λ£¨κΈ° μν μΈν°νμ΄μ€λ₯Ό ν¨μν μΈν°νμ΄μ€λΌκ³ μ μ
- ν¨μν μΈν°νμ΄μ€λ νλμ μΆμ λ©μλλ§ μ μν΄μΌ λ¨
- λλ€μκ³Ό μΈν°νμ΄μ€μ λ©μλλ₯Ό 1:1λ‘ μ°κ²°ν΄μΌ νκΈ° λλ¬Έ
- static λ©μλμ default λ©μλλ μ μ½ X
- @FunctionalInteface μ λν μ΄μ μ λΆμ΄λ©΄ μ»΄νμΌλ¬κ° μ νν ν¨μν μΈν°νμ΄μ€μΈμ§ νμΈν΄ μ€
ν¨μν μΈν°νμ΄μ€ νμ μ 맀κ°λ³μμ λ°ν νμ
- λ©μλμ 맀κ°λ³μκ° ν¨μν μΈν°νμ΄μ€ νμ μΌ μ ν΄λΉ μΈμλ‘ λλ€μμ μ°Έμ‘°νλ μ°Έμ‘° λ³μλ₯Ό 맀κ°λ³μλ‘ μ§μ ν΄μΌ ν¨
- μ°Έμ‘° λ³μ μμ΄ μ§μ λλ€μμ 맀κ°λ³μλ‘ μ§μ νλ κ²λ κ°λ₯
- λ³μμ²λΌ λ©μλλ₯Ό μ£Όκ³ λ°λ κ²μ΄ κ°λ₯ν΄μ§
- μ¬μ€μ λ©μλκ° μλλΌ κ°μ²΄λ₯Ό μ£Όκ³ λ°λ κ²μ΄μ§λ§ μ½λκ° λ κ°κ²°ν΄μ§
λλ€μμ νμ κ³Ό νλ³ν
- λλ€μμ νμ
μ΄ ν¨μν μΈν°νμ΄μ€μ νμ
κ³Ό μ νν μΌμΉνλ κ²μ μλ
- λλ€μμ νμ
μΆλ ₯ μ
μΈλΆν΄λμ€μ΄λ¦&&Lambda&&λ²νΈ
- ν¨μν μΈν°νμ΄μ€μ μΌμΉνκΈ° μν ν λ³νμ΄ νμνμ§λ§ νλ³νμ μλ΅ κ°λ₯
- λλ€μμ νμ
μΆλ ₯ μ
- Objectλ‘μ νλ³νμ λΆκ°λ₯
- λλ€μμ μ€μ§ ν¨μν μΈν°νμ΄μ€λ‘λ§ νλ³ν κ°λ₯
μΈλΆ λ³μλ₯Ό μ°Έμ‘°νλ λλ€μ
- μ΅λͺ ν΄λμ€μ λμΌν λ°©μμΌλ‘ λλ€μλ μΈλΆμ μ μΈλ λ³μμ μ κ·Ό κ°λ₯
- λλ€μ λ΄μμ μ°Έμ‘°νλ μ§μλ³μλ finalμ΄ λΆμ§ μμμ΄λ μμλ‘ κ°μ£Ό
- μΈλΆ μ§μλ³μμ κ°μ μ΄λ¦μ λλ€μ 맀κ°λ³μλ νμ© X
1.4 java.util.function ν¨ν€μ§
- λλΆλΆμ λ©μλλ νμ
μ΄ λΉμ·νκ³ μ§λ€λ¦ λ©μλλ‘ μ μν μ μμ
- κ°λ₯νλ©΄ 미리 μ μν΄ λ μΈν°νμ΄μ€λ₯Ό νμ©
- λ©μλ μ΄λ¦ ν΅μΌ, μ¬μ¬μ©μ±, μ μ§ λ³΄μ μΈ‘λ©΄μμ μ’μ
- κ°μ₯ κΈ°λ³Έμ μΈ ν¨μν μΈν°νμ΄μ€
- run() : 맀κ°λ³μ X, λ°νκ° X
- Supplier<T> : 맀κ°λ³μ X, λ°νκ° O
- Consumer<T> : 맀κ°λ³μ O, λ°νκ° X
- Function<T,R> : νλμ 맀κ°λ³μλ₯Ό λ°μμ κ²°κ³Όλ₯Ό λ°ννλ μΌλ°μ μΈ ν¨μ
- Predicate<T> : 맀κ°λ³μ νλ, boolean νμ λ°ν, 쑰건μμ νννλ λ° μ¬μ©
쑰건μμ ννμ μ¬μ©λλ Predicate
- Predicateλ Functionμμ λ°ν νμ μ΄ booleanμ΄λΌλ μ°¨μ΄
- 쑰건μμ λλ€μμΌλ‘ νννλ λ° μ¬μ©
맀κ°λ³μκ° λ κ°μΈ ν¨μν μΈν°νμ΄μ€
- μ΄λ¦ μμ μ λμ¬
'Bi'
κ° λΆμ - μ’
λ₯
- BiConsumer<T,U> : λ κ°μ 맀κ°λ³μ, λ°νκ° X
- BiPredicate<T,U> : 쑰건μμ νννλ λ° μ¬μ©, 맀κ°λ³μλ λ, λ°νκ°μ boolean
- BiFunction<T,U,R> : λ κ°μ 맀κ°λ³μλ₯Ό λ°μμ νλμ κ²°κ³Ό λ°ν
- 3κ° μ΄μμ 맀κ°λ³μλ₯Ό κ°λ ν¨μν μΈν°νμ΄μ€λ μ§μ ꡬνν΄μ μ¬μ© κ°λ₯
UnaryOperatorμ BinaryOperator
- 맀κ°λ³μμ νμ κ³Ό λ°ν νμ μ νμ μ΄ λͺ¨λ μΌμΉνλ μ λ§ μ μΈνκ³ λ Functionκ³Ό κ°μ
- μ’
λ₯
- UnaryOperator<T> : Functionμ μμ, 맀κ°λ³μμ κ²°κ΄κ°μ νμ μ΄ λμΌ
- BinaryOperator<T> : Functionμ μμ, λ 맀κ°λ³μμ κ²°κ΄κ°μ νμ μ΄ λμΌ
컬λ μ νλ μμκ³Ό ν¨μν μΈν°νμ΄μ€
- 컬λ μ νλ μμμ μΈν°νμ΄μ€μ λ€μμ λν΄νΈ λ©μλ μΆκ°
- κ·Έμ€ μΌλΆλ ν¨μν μΈν°νμ΄μ€λ₯Ό μ¬μ©
- Collection μΈν°νμ΄μ€
- boolean removeif(Predicate<E> filter) : 쑰건μ λ§λ μμλ₯Ό μμ
- List μΈν°νμ΄μ€
- void replaceAll(UnaryOperator<E> operator) : λͺ¨λ μμλ₯Ό λ³ννμ¬ λ체
- Iterable μΈν°νμ΄μ€
- void forEach(Consumer<T> action) : λͺ¨λ μμμ μμ actionμ μν
- Map μΈν°νμ΄μ€
- V compute(K key, BiFunction<K,V,V> f) : μ§μ λ ν€μ κ°μ μμ fλ₯Ό μν
- V computeIfAbsent(K key, Function<K,V> f) : ν€κ° μμΌλ©΄ μμ f μν ν μΆκ°
- V conputeIfPresent(K key, BiFunction<K,V,V> f) : μ§μ λ ν€κ° μμ λ μμ f μν
- V merge(K key, V value, BiFunction<K,V,V> f) : λͺ¨λ μμμ λ³ν©μμ fλ₯Ό μν
- void forEach(BiConsumer<K,V> action) : λͺ¨λ μμμ μμ actionμ μν
- void replaceAll(BiFunction<K,V,V> f) : λͺ¨λ μμμ μΉνμμ fλ₯Ό μν
κΈ°λ³Ένμ μ¬μ©νλ ν¨μν μΈν°νμ΄μ€
- κΈ°λ³Έν λμ λνΌ ν΄λμ€λ‘ μ¬μ©νλ κ²μ λΉν¨μ¨μ
- λ³΄λ€ ν¨μ¨μ μΈ μ²λ¦¬λ₯Ό μν΄ κΈ°λ³Ένμ μ¬μ©νλ ν¨μν μΈν°νμ΄μ€λ€ μ 곡
- μ’
λ₯
- DoubleToIntFunction : μ λ ₯μ΄ double νμ , μΆλ ₯μ΄ int νμ
- ToIntFunction<T> : μ λ ₯μ μ§λ€λ¦, μΆλ ₯μ int νμ
- IntFunction<R> : μ λ ₯μ΄ int νμ , μΆλ ₯μ μ§λ€λ¦ νμ
- ObjIntConsumer<T> : μ λ ₯μ΄ μ§λ€λ¦κ³Ό int, μΆλ ₯μ μμ
1.5 Functionμ ν©μ±κ³Ό Predicate κ²°ν©
- static λ©μλλ‘ μ μλμ΄ μμ
Functionμ ν©μ±
- λ λλ€μμ ν©μ±ν΄μ μλ‘μ΄ λλ€μμ λ§λ€ μ μμ
- f.andThen(g)
- fμ κ²°κ³Όκ°μ gλ‘ λ°μμ κ°μ λ°ν
- f.compose(g)
- andThenκ³Ό λ°λ
- gμ κ²°κ³Όκ°μ fλ‘ λ°μμ κ°μ λ°ν
- identity()
- νλ± ν¨μκ° νμν λ μ¬μ©
- λλ€μμΌλ‘ νν μ
x->x
- map()μΌλ‘ λ³νμμ ν λ λ³ν μμ΄ κ·Έλλ‘ μ²λ¦¬νκ³ μ ν λ μ¬μ©
Predicateμ κ²°ν©
- 쑰건μλ€μ λ Όλ¦¬ μ°μ°μλ‘ νλμ μμΌλ‘ ꡬμ±ν μ μλ―μ΄ μ¬λ¬ Predicateλ κ²°ν© κ°λ₯
- and(), or(), negeate()λ‘ μ°κ²°
- negateλ
!
μ μλ―Έ
1.6 λ©μλ μ°Έμ‘°
- λλ€μμ λμ± κ°κ²°νκ² ν μ μλ λ°©λ²
- λλ€μμ΄ νλμ λ©μλλ§ νΈμΆνλ κ²½μ°μλ§ μ¬μ©
- μ°λ³ λ©μλμ μ μΈ λΆλΆμ΄λ μ’λ³ μΈν°νμ΄μ€μ μ§μ λ μ§λ€λ¦ νμ μΌλ‘λΆν° μμλΌ μ μλ λ΄μ©μ μλ΅
- νν
- static λ©μλ, μΈμ€ν΄μ€ λ©μλ μ°Έμ‘°λ
ν΄λμ€μ΄λ¦::λ©μλμ΄λ¦
λ‘ νν - νΉμ κ°μ²΄ μΈμ€ν΄μ€λ©μλ μ°Έμ‘°λ
μ°Έμ‘°λ³μ::λ©μλμ΄λ¦
μ κ°μ λ°©μμΌλ‘ νν
- static λ©μλ, μΈμ€ν΄μ€ λ©μλ μ°Έμ‘°λ
μμ±μμ λ©μλ μ°Έμ‘°
ν΄λμ€μ΄λ¦::new
μ κ°μ λ°©μμΌλ‘ νν- λ°°μ΄μ κ²½μ°μ
μλ£ν[]::new
μ κ°μ λ°©μμΌλ‘ νν
2. μ€νΈλ¦Ό(stream)
2.1 μ€νΈλ¦Όμ΄λ?
- forλ¬Έκ³Ό Iteratorμ λ¨μ
- μ½λκ° κΈΈλ€.
- μμ보기 μ΄λ €μ
- μ¬μ¬μ©μ± λ¨μ΄μ§
- λ°μ΄ν° μμ€λ§λ€ λ€λ₯Έ λ°©μμΌλ‘ λ€λ€μΌ ν¨
- μ΄λ¬ν λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄
μ€νΈλ¦Ό
μ λ§λ¦- λ°μ΄ν° μμ€λ₯Ό μΆμν
- 컬λ μ , νμΌμ μ μ₯λ λ°μ΄ν°λ₯Ό λͺ¨λ κ°μ λ°©μμΌλ‘ λ€λ£Έ
μ€νΈλ¦Όμ λ°μ΄ν° μμ€λ₯Ό λ³κ²½νμ§ μλλ€.
- λ°μ΄ν°λ₯Ό μ½κΈ°λ§ ν λΏ λ³κ²½ X
- λ³κ²½ νμμ κ²°κ³Όλ₯Ό 컬λ μ , λ°°μ΄ λ±μ ν λΉ
μ€νΈλ¦Όμ μΌνμ©μ΄λ€.
- μ€νΈλ¦Όμ Iteratorμ²λΌ μΌνμ©
- νλ² μ¬μ©νλ©΄ λ«νμ λ€μ μ¬μ© λΆκ°
- μ¬μ¬μ© νμμ μ¬μμ±
μ€νΈλ¦Όμ μμ μ λ΄λΆ λ°λ³΅μΌλ‘ μ²λ¦¬νλ€.
- λ΄λΆ λ°λ³΅μ΄λΌλ κ²μ λ°λ³΅λ¬Έμ λ©μλμ λ΄λΆμ μ¨κΈΈ μ μλ€λ μλ―Έ
- forEach()λ λ©μλ μμΌλ‘ forλ¬Έμ λ£μ κ²
μ€νΈλ¦Όμ μ°μ°
- μ€κ° μ°μ°
- μ°μ° κ²°κ³Όκ° μ€νΈλ¦Ό
- μ°μν΄μ μ€κ° μ°μ° κ°λ₯
- μ΅μ’
μ°μ°
- μ°μ° κ²°κ³Όκ° μ€νΈλ¦Όμ΄ μλ μ°μ°
- μ€νΈλ¦Όμ μμλ₯Ό μλͺ¨νλ―λ‘ λ¨ ν λ²λ§ κ°λ₯
μ§μ°λ μ°μ°
- μ€νΈλ¦Όμ μ΅μ’ μ°μ°μ΄ μνλκΈ° μ κΉμ§ μ€κ° μ°μ°μ΄ μν X
- μ΅μ’ μ°μ°μ΄ μνλμ΄μΌ μ€νΈλ¦Όμ μμλ€μ΄ μ€κ° μ°μ°μ κ±°μ³ μ΅μ’ μ°μ°μμ μλͺ¨
Stream<Integer>μ IntStream
- μ€ν λ°μ±&μΈλ°μ±μΌλ‘ μΈν λΉν¨μ¨μ μ€μ΄κΈ° μν΄ κΈ°λ³ΈνμΌλ‘ λ°μ΄ν° μμ€μ μμλ₯Ό λ€λ£¨λ μ€νΈλ¦Όλ μ 곡
- IntStream, LongStream, DoubleStream μ 곡
λ³λ ¬ μ€νΈλ¦Ό
- λ΄λΆμ μΌλ‘ fork&join νλ μμμ μ΄μ©ν΄μ μλμ μΌλ‘ μ°μ°μ λ³λ ¬λ‘ μν
- parallel()μ νΈμΆνλ©΄ λ³λ ¬λ‘ μ°μ°μ μννλλ‘ μ§μν μ μμ
- λ³λ ¬λ‘ μ²λ¦¬λμ§ μκ² νλ €λ©΄ sequential() νΈμΆ
- λͺ¨λ μ€νΈλ¦Όμ κΈ°λ³Έμ μΌλ‘ λ³λ ¬ μ€νΈλ¦Όμ΄ μλ
- λ³λ ¬μ²λ¦¬κ° νμ λ λΉ λ₯Έ κ²°κ³Όλ₯Ό μ»κ² ν΄μ£Όλ κ²μ μλ
2.2 μ€νΈλ¦Ό λ§λ€κΈ°
컬λ μ
- Stream<T> Collection.stream() μ¬μ©
λ°°μ΄
- Stream<T> Stream.of(~) λ©μλλ‘ μ€νΈλ¦Ό μμ±
- int λ±μ κΈ°λ³Ένμ
IntStream IntStream.of(~)
λ©μλλ‘ μμ±
νΉμ λ²μμ μ μ
- IntStream, LongStreamμ΄ κ°κ³ μλ λ©μλ
- μ°μλ μ μμ μ€νΈλ¦Όμ μμ± ν λ°ν
- IntStream.range(int begin, int end)
- end κ° λ―Έν¬ν¨
- IntStream.rangeClosed(int begin, int end)
- end κ° ν¬ν¨
μμμ μ
- Random ν΄λμ€μμ μ 곡νλ λμλ₯Ό μμ±νλ λ° μ¬μ©λλ λ©μλ
- Intstream ints(), LongStream longs(), DoubleStream doubles()
- ν¬κΈ°κ° μ ν΄μ§μ§ μμ 무ν μ€νΈλ¦Όμ λ°ν
- limit()μ κ°μ΄ μ¬μ©νμ¬ ν¬κΈ°λ₯Ό μ νν΄ μ€ κ²
- 맀κ°λ³μλ‘ λ²μλ₯Ό μ§μ ν μ μμ (end κ° λ―Έν¬ν¨)
λλ€μ - iterate(), generate()
- λλ€μμ 맀κ°λ³μλ‘ λ°μμ κ³μ°λλ κ°λ€μ μμλ‘ νλ 무ν μ€νΈλ¦Ό μμ±
- iterateλ μ¨μ κ°μΌλ‘ μ§μ λ κ°λΆν° μμ, λλ€μμ μν΄ κ³μ°λ κ²°κ³Όλ₯Ό λ€μ seed κ°μΌλ‘ ν΄μ κ³μ° λ°λ³΅
- generateλ 맀κ°λ³μκ° μλ λλ€μ(Supplier)λ§ νμ©νκΈ° λλ¬Έμ, μ΄μ κ°μΌλ‘ κ³μ° X
- λμ μν΄ μμ±λ μ€νΈλ¦Όμ κΈ°λ³Έν νμ
μ μ°Έμ‘° λ³μλ‘ λ€λ£¨κΈ° μν΄μ mapToInt()μ κ°μ λ³ν λ©μλ νμ
- λ°λλ boxed() λ©μλ μ¬μ©
νμΌ
- java.nio.file.Filesμμ μ§μ λ λλ ν°λ¦¬μ μλ νμΌμ λͺ©λ‘μ μμ€λ‘ νλ μ€νΈλ¦Όμ μμ± ν λ°ννλ λ©μλ μ§μ
- Stream<Path> File.list(Path dir)
- νμΌμ ν νμ μμλ‘ νλ μ€νΈλ¦Ό μμ± λ©μλλ μ‘΄μ¬
- Files.lines(~)
λΉ μ€νΈλ¦Ό
- μμκ° λΉμ΄μλ μ€νΈλ¦Ό μμ± μ null λ³΄λ¨ Stream.empty()λ₯Ό μ¬μ©ν΄μ λ§λ€ κ²
- nullμ ν λΉν΄λ μ€λ₯λ μλλ€.
λ μ€νΈλ¦Όμ μ°κ²°
- κ°μ νμ μ λ μ€νΈλ¦Όμ concat()μΌλ‘ μ°κ²°ν μ μλ€.
2.3 μ€νΈλ¦Όμ μ€κ° μ°μ°
μ€νΈλ¦Ό μλ₯΄κΈ° - skip(), limit()
- skip()μ μμλ₯Ό 건λ λ
- limitμ μ€νΈλ¦Όμ μμλ₯Ό μ ν(μλΌλ)
- κΈ°λ³Έν μ€νΈλ¦Όμλ μ μλμ΄ μμ
μ€νΈλ¦Ό μμ κ±Έλ¬λ΄κΈ° - filter(), distinct()
- filter()λ μ£Όμ΄μ§ 쑰건(Predicate)μ λ§μ§ μλ μμλ₯Ό κ±Έλ¬λ
- μ°μ° κ²°κ³Όκ° booleanμΈ λλ€μμ μ¬μ©ν΄λ λλ€.
- νμνλ€λ©΄ filter()λ₯Ό λ€λ₯Έ 쑰건μΌλ‘ μ¬λ¬ λ² μ¬μ© κ°λ₯
- distinct()λ μ€λ³΅λ μμλ₯Ό μ κ±°
μ λ ¬ - sorted()
- sort()λ μ§μ λ Comparatorλ‘ μ€νΈλ¦Όμ μ λ ¬
- Comparator λμ int κ°μ λ°ννλ λλ€μ μ¬μ© κ°λ₯
- Comparatorκ° μ§μ λμ΄ μμ§ μμΌλ©΄ μ€νΈλ¦Ό μμμ κΈ°λ³Έ μ λ ¬ κΈ°μ€(Comparable)λ‘ μ λ ¬
- JDK 1.8λΆν° Comparator μΈν°νμ΄μ€μ static λ©μλμ λν΄νΈ λ©μλκ° λ§μ΄ μΆκ°
- λΉκ΅ λμμ΄ κΈ°λ³ΈνμΈ κ²½μ° thenComparing()μ΄ ν¨μ¨μ
λ³ν - map()
- μνλ νλλ§ λ½μλ΄κ±°λ νΉμ ννλ‘ λ³νν΄μΌ ν λ μ¬μ©
- T νμ μ R νμ μΌλ‘ λ³νν΄μ λ°ννλ ν¨μλ₯Ό μ§μ ν΄μΌ ν¨
- νλμ μ€νΈλ¦Όμ μ¬λ¬ λ² μ μ© κ°λ₯
μ‘°ν - peek()
- μ°μ°κ³Ό μ°μ° μ¬μ΄μ μ¬λ°λ₯΄κ² μ²λ¦¬λμλμ§ νμΈν λ μ¬μ©
- forEachμλ λ¬λ¦¬ μ€νΈλ¦Ό μμ μλͺ¨ X
mapToInt(), mapToLong(), mapToDouble()
- Stream<T> νμ μ μ€νΈλ¦Όμ κΈ°λ³Έν μ€νΈλ¦ΌμΌλ‘ λ³νν λ μ¬μ©νλ λ©μλλ€
- κΈ°λ³Ένλ§ λ€λ£° λ μ°μ° μ λ°λ‘ κΈ°λ³ΈνμΌλ‘ λ³νν νμκ° μμΌλ―λ‘ ν¨μ¨μ
- Stream<T> λ³΄λ€ μ«μλ₯Ό λ€λ£¨λλ° νΈλ¦¬ν λ©μλλ€μ λ μ 곡ν¨
- sum(), average(), max(), min()
- μ΄ λ©μλλ€μ μ΅μ’ μ°μ°μ΄κΈ° λλ¬Έμ νΈμΆ ν μ€νΈλ¦Όμ΄ λ«ν
- μ€νΈλ¦Όμ λ€μ μμ±ν΄μΌ νλ λΆνΈν¨μ λκΈ° μν΄
summaryStatistics()
λ©μλ μ 곡
- mapToObj() : κΈ°λ³Έν μ€νΈλ¦Όμ Stream<T>μΌλ‘ λ³ν
- boxed() : IntStreamμ Stream<Integer>λ‘ λ³ν
flatMap() - Stream<T[]>λ₯Ό Stream<T>λ‘ λ³ν
- μ€νΈλ¦Όμ μμλ map()μ μ°μ° κ²°κ³Όκ° λ°°μ΄μΌ κ²½μ° Stream<T>λ‘ λ³ννκΈ° μν΄ flatMap() μ¬μ©
- flatMap()μ μ€νΈλ¦Όμ μ€νΈλ¦Όμ΄ μλ μ€νΈλ¦ΌμΌλ‘ λ§λ€μ΄μ€λ€.
- μ€νΈλ¦Όμ μ€νΈλ¦Όμ νλμ μ€νΈλ¦ΌμΌλ‘ ν©μΉ λλ flatMap() μ¬μ©
2.4 Optional<T>κ³Ό OptionalInt
- Optional<T>λ μ§λ€λ¦ ν΄λμ€λ‘
T νμ μ κ°μ²΄λ₯Ό κ°μΈλ λνΌ ν΄λμ€
- Optional νμ μ κ°μ²΄μλ λͺ¨λ νμ μ μ°Έμ‘° λ³μλ₯Ό λ΄μ μ μμ
- private final T value νλλ₯Ό class λ΄λΆμμ κ°μ§κ³ μμ
- λ°νλ κ²°κ³Όκ° null μΈμ§ ifλ¬ΈμΌλ‘ 체ν¬νλ λμ Optionalμ μ μλ λ©μλλ‘ μ²λ¦¬ κ°λ₯
Optional κ°μ²΄ μμ±νκΈ°
- of() λλ ofNullable()μ μ¬μ©
- μ°Έμ‘° λ³μμ κ°μ΄ null μΌ κ°λ₯μ±μ΄ μμΌλ©΄ ofNullable() μ¬μ©
- nullλ‘ μ΄κΈ°ν νκΈ°λ³΄λ¨ empty()λ‘ μ΄κΈ°ννλ κ²μ΄ λ°λμ§
Optional κ°μ²΄μ κ° κ°μ Έμ€κΈ°
- Optional κ°μ²΄μ κ°μ get()μΌλ‘ κ°μ Έμ¬ μ μμ
- null μΌ λλ NoSuchElementException λ°μ
- μμΈλ₯Ό λλΉν΄μ orElse()λ‘ λ체ν κ° μ§μ κ°λ₯
- orElseGet()μΌλ‘ null κ°μ λ체ν λλ€μ μ§μ κ°λ₯
- orElseThrow()λ‘ null μΌ λ μ§μ λ μμΈλ₯Ό λ°μμν¬ μλ μμ
- κ°μ μ‘΄μ¬λ₯Ό νμΈν μ μλ isPresent() λ©μλμ κ°μ΄ μμ λ μ¬μ©ν μ μλ ifPresent() λ©μλ μ‘΄μ¬
- Stream ν΄λμ€μ μ μλ λ©μλ μ€μμ Optional<T>μ λ°ννλ κ²λ€μ΄ μ‘΄μ¬
- findAny(), findFirst(), max(), min(), reduce()
OptinalInt, OptionalLong, OptionalDouble
- κΈ°λ³Ένμ κ°μΌλ‘ νλ Optinalλ€
- IntStream λ±μλ ν΄λΉ ν΄λμ€λ₯Ό λ°ννλ λ©μλ μ‘΄μ¬
- κΈ°μ‘΄μ get()μ΄ getAsInt() λ± λ©μλ μ΄λ¦μ΄ μ‘°κΈμ© λ€λ¦
- κΈ°λ³Έν intκ° 0 μΌ λμ μλ¬΄λ° κ°μ κ°μ§ μλ μν©μ ꡬλ³νκΈ° μν΄ ν΄λμ€ λ΄λΆμ isPresentλΌλ μΈμ€ν΄μ€ λ³μλ₯Ό λκ³ κ΅¬λΆ
2.5 μ€νΈλ¦Όμ μ΅μ’ μ°μ°
- μ΅μ’ μ°μ°μ μ€νΈλ¦Όμ μμλ₯Ό μλͺ¨ ν κ²°κ³Όλ₯Ό λ§λ€μ΄λ
- μ΅μ’ μ°μ° νμ μ€νΈλ¦Όμ΄ λ«νκ³ λ μ΄μ μ¬μ© λΆκ°
- μ΅μ’ κ²°κ³Όλ λ¨μΌ κ°μ΄κ±°λ λ°°μ΄ λλ 컬λ μ
forEach()
- λ°ν νμ void
- μ€νΈλ¦Όμ μμλ₯Ό μΆλ ₯νλ λ±μ μ©λλ‘ μ¬μ©
쑰건 κ²μ¬ - allMatch(), anyMatch(), noneMatch(), findFirst(), findAny()
- μ€νΈλ¦Όμ μμμ λν΄ μ§μ λ 쑰건μΌλ‘ νμΈνλ λ° μ¬μ©ν μ μλ λ©μλλ€
- μ°μ° κ²°κ³Όλ‘ boolean λ°ν
- findAny()μ findFirst()μ λ°ν νμ
μ Optional<T>
- μμκ° μμ μ λΉμ΄μλ Optional κ°μ²΄λ₯Ό λ°ν
ν΅κ³ - count(), sum(), average(), max(), min()
- μ€νΈλ¦Όμ μμλ€μ λν ν΅κ³ μ 보λ₯Ό μ»μ μ μλ λ©μλλ€
- κΈ°λ³Ένμ΄ μλ μμ count(), max(), min() μΈ κ°μ§ λ©μλλ€λ§ μ¬μ© κ°λ₯
- μμ λ©μλλ€μ μ¬μ©νκΈ°λ³΄λ¨ κΈ°λ³Έν μ€νΈλ¦ΌμΌλ‘ λ³ννκ±°λ reduce()μ collect()λ₯Ό μ¬μ©ν΄μ ν΅κ³ μ 보λ₯Ό μ»μ
리λμ± - reduce()
- μ€νΈλ¦Όμ μμλ₯Ό μ€μ¬λκ°λ©΄μ μ°μ°μ μνν λ€ μ΅μ’ κ²°κ³Όλ₯Ό λ°ν
- μ²μ λ μμλ₯Ό κ°μ§κ³ μ°μ°ν κ²°κ³Όλ₯Ό κ·Έλ€μ μμμ μ°μ°
- 맀κ°λ³μμ νμ BinaryOperator<T>
- 맀κ°λ³μκ° μ΄κΈ°κ°μ κ°λ reduce()λ μ΄κΈ°κ°κ³Ό μ€νΈλ¦Όμ 첫 λ²μ§Έ μμλ‘ μ°μ°μ μμ
- μ€νΈλ¦Όμ μμκ° μμ μ μ΄κΈ°κ°μ΄ λ°ν
- μ΄κΈ°κ°μ΄ μμΌλ―λ‘ λ°ν νμ μ΄ Optionalμ΄ μλ T (μ΄κΈ° κ°μ΄ μλ reduce λ©μλλ λ°νκ° Optional)
- combiner 맀κ°λ³μλ λ³λ ¬ μ€νΈλ¦Όμ μν΄ μ²λ¦¬λ κ²°κ³Όλ₯Ό ν©μΉ λ μ¬μ©νλ 맀κ°λ³μ
2.6 collect()
- μ€νΈλ¦Όμ μ΅μ’ μ°μ° μ€ κ°μ₯ 볡μ‘νλ©΄μλ μ μ©νκ² νμ©
- 리λμ±κ³Ό μ μ¬ν λ°©μ
- collect()μ 맀κ°λ³μλ‘ μ΄λ»κ² μμ§ν κ²μΈκ°μ λν λ°©λ²μ΄ μ μλμ΄μΌ νλλ° κ·Έ λ°©λ²μ μ μν κ²μ΄ collector
- collect()λ₯Ό μ¬μ©νκΈ° μν΄ μμμΌ νλ κ²
- collect() : μ€νΈλ¦Όμ μ΅μ’ μ°μ°, 맀κ°λ³μλ‘ μ»¬λ ν°λ₯Ό νμλ‘ ν¨
- Collector : μΈν°νμ΄μ€, 컬λ ν°λ μ΄ μΈν°νμ΄μ€λ₯Ό ꡬνν΄μΌ ν¨
- Collectors : ν΄λμ€, static λ©μλλ‘ λ―Έλ¦¬ μμ±λ 컬λ ν°λ₯Ό μ 곡
- 맀κ°λ³μλ‘ Collector ꡬνμ²΄κ° λ€μ΄κ° collect λ©μλμ Supplier, BiConsumer λ κ°κ° λ€μ΄κ° λ©μλ μ‘΄μ¬
- λ λ²μ§Έ λ©μλλ μ μ¬μ©λμ§ μλλ€.
μ€νΈλ¦Όμ 컬λ μ κ³Ό λ°°μ΄λ‘ λ³ν - toList(), toSet(), toMap(), toCollection, toArray()
- Listλ Collectors.toList() μ¬μ©
- νΉμ 컬λ μ
μ toCollection()μ ν΄λΉ 컬λ μ
μ μμ±μ μ°Έμ‘°λ₯Ό 맀κ°λ³μλ‘ λ£κΈ°
- ex) ArrayList::new
- Mapμ κ²½μ°μ toMap λ©μλμ νλΌλ―Έν°λ‘ ν€μ κ°μ μ ν΄μ€μΌ ν¨
- μ€νΈλ¦Όμμ μ μ₯λ μμλ€μ λ°°μ΄λ‘ λ°ννλ €λ©΄ (stream μ°Έμ‘° λ³μ).toArray() μ¬μ©
- μνλ νμ μ μμ±μ μ°Έμ‘°λ₯Ό 맀κ°λ³μλ‘ μ§μ
- 맀κ°λ³μλ₯Ό μ§μ νμ§ μμ μ λ°°μ΄μ νμ μ Object[]
ν΅κ³ - counting(), summingInt(), averageInt(), maxBy(), minBy()
- collect()κ° μλμ΄λ μμ μ°μ°λ€μ κ²°κ³Όλ₯Ό μ»μ μ μμ§λ§ collect()λ₯Ό μ¬μ©νλ©΄ groupingBy()μ ν¨κ» μ¬μ© κ°λ₯
리λμ± - reducing()
- collect()μμ 리λμ±λ μ¬μ© κ°λ₯
- 맀κ°λ³μμ λ°λΌ 3κ°μ§ μ’ λ₯κ° μμ
λ¬Έμμ΄ κ²°ν© - joining()
- λ¬Έμμ΄ μ€νΈλ¦Όμ λͺ¨λ μμλ₯Ό νλμ λ¬Έμμ΄λ‘ μ°κ²°ν΄μ λ°ν
- ꡬλΆμμ μ λμ¬, μ λ―Έμ¬λ μ§μ κ°λ₯
κ·Έλ£Ήνμ λΆν - groupingBy(), partitioningBy()
- μ€νΈλ¦Όμ μμλ₯Ό νΉμ κΈ°μ€μΌλ‘ κ·Έλ£Ήν
- groupingBy()λ μ€νΈλ¦Όμ μμλ₯Ό FunctionμΌλ‘ λΆλ₯
- partitioningBy()λ μ€νΈλ¦Όμ μμλ₯Ό Predicateλ‘ λΆλ₯
- μ€νΈλ¦Όμ λ κ·Έλ£ΉμΌλ‘ λλ λ groupingBy() λ³΄λ€ λΉ λ¦
partitioningBy()μ μν λΆλ₯
- μμλ‘
collect(Collectors.partitioningBy(Student::isMale))
κ³Ό κ°μ λ°©μμΌλ‘ νμλ€μ μ±λ³λ‘ λΆν ν μ μλ€.- Map<Boolean, List>μ return κ°μ λ°κ² λλ©° get(true)λ‘ μ‘°κ±΄μ λ§λ νμ listλ₯Ό μ»μ μ μλ€.
- get(false)μ κ²½μ° μ‘°κ±΄μ λ§μ§ μλ νμ (μ μμλ‘λ μ¬νμ)μ listλ₯Ό μ»μ μ μλ€.
collect(Collectors.partitioningBy(Student::isMale, counting()))
κ³Ό κ°μ λ°©μμΌλ‘ νμμ μ μμ ꡬν μ μλ€.- μ΄μΈμλ λ λ²μ§Έ νλΌλ―Έν°μ maxBy, collectingAndThen, λ λ€λ₯Έ partitioningBy() λ±μ λ£μ΄μ€ μ μλ€.
- κ²½μ°μ λ°λΌ T μ체λ Optionalλ₯Ό MapμΌλ‘ return λ°μ μ μμ
groupingBy()μ μν λΆλ₯
- groupingBy()λ‘ κ·Έλ£Ήν μ κΈ°λ³Έμ μΌλ‘ Listμ κ°μ λ΄μ
- νμμ toList() λμ toSet(), toCollection(HashSet::new)μ μ¬μ© κ°λ₯ (Mapμ μ§λ€λ¦ νμ λ μ μ ν λ³κ²½ν΄ μ€μΌ ν¨)
- groupingBy()μ μ¬λ¬ λ² μ¬μ©νλ©΄ λ€μμ€ κ·Έλ£Ήνκ° κ°λ₯ν¨
2.7 Collector ꡬννκΈ°
- Collector μΈν°νμ΄μ€λ₯Ό ꡬνν΄μΌ ν¨
- characteristics()λ₯Ό μ μΈν 4κ°μ λλ€μμ μμ±ν΄μΌ ν¨
- supplier() : μμ κ²°κ³Όλ₯Ό μ μ₯ν 곡κ°μ μ 곡
- accumulator() : μ€νΈλ¦Όμ μμλ₯Ό μμ§ν λ°©λ² μ 곡
- combiner() : λ μ μ₯ 곡κ°μ λ³ν©ν λ°©λ²μ μ 곡 (λ³λ ¬ μ€νΈλ¦Ό)
- finisher() : κ²°κ³Όλ₯Ό μ΅μ’ μ μΌλ‘ λ³νν λ°©λ² μ 곡
- characteristics()λ 컬λ ν°κ° μννλ μμ
μ μμ±μ λν μ 보λ₯Ό μ 곡
- Characteristics.CONCURRENT : λ³λ ¬λ‘ μ²λ¦¬ν μ μλ μμ
- Characteristics.UNORDERED : μ€νΈλ¦Όμ μμμ μμκ° μ μ§λ νμκ° μλ μμ
- Characteristics.IDENTITY_FINISH : finisher()κ° νλ± ν¨μμΈ μμ
- μλ¬΄λ° μμ±λ μ§μ νκ³ μΆμ§ μμ λ Collections.emptySet()μ return νλλ‘ κ΅¬ν
'Java > Javaμ μ μ' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
Chapter 16 - λ€νΈμνΉ (0) | 2022.05.25 |
---|---|
Chapter 15 - μ μΆλ ₯ I/O (0) | 2022.05.19 |
Chapter 13 - μ°λ λ(Thread) (0) | 2022.05.12 |
Chapter 12 - μ λ€λ¦μ€, μ΄κ±°ν, μ λν μ΄μ (0) | 2022.05.09 |
Chapter 11 - 컬λ μ νλ μμ (0) | 2022.05.05 |