Lambdas and Stream
Streams API
λ€λ₯Έ κ°μ²΄λ₯Ό ν¬ν¨νλ 컬λ μ μ΄λΌλ μ°λ¦¬κ° μ»κ³ μ νλ μ 보λ λΉμ·ν μ μλ€.
μλ₯Ό λ€μ΄, 'μ΄λ¬ν 쑰건μ λ§λ μμ΄ν μ μ€', 'μ΄λ¬ν λ°©λ²μ νμ©ν΄μ λͺ¨λ μμ΄ν μ λ°κΏμ€, ' 'μ€λ³΅λ λ°μ΄ν°λ μ§μμ€', λλ 'μ΄λ° λ°©λ²μΌλ‘ μμλ€μ μ λ ¬ν΄ μ€' λ±μ 컬λ μ μ μμ²νλ€κ³ μκ°ν΄ 보μ. μ°λ¦¬λ μ΄λ¬ν μμ²μ μ²λ¦¬νκΈ° μν΄ forλ¬Έκ³Ό Iteratorλ₯Ό μ΄μ©ν΄μ μ½λλ₯Ό μμ±νκ±°λ κ° μ»¬λ μ ν΄λμ€μ λ§λ λ©μλλ₯Ό μ¬μ©ν΄ μλ€. Listλ₯Ό μ λ ¬ν λλ Collections.sort()λ₯Ό μ¬μ©νκ³ λ°°μ΄μ μ λ ¬ν λλ Arrays.sort()λ₯Ό μ¬μ©νλ€.
Streams APIλ λ°μ΄ν° μμ€λ₯Ό μΆμν ν΄μ λ°μ΄ν° μμ€κ° 무μμ΄λ κ°μ λ°©μμΌλ‘ λ€λ£° μ μλ λ©μλλ₯Ό μ κ³΅ν΄ μ€λ€. κ·Έλμ μ°λ¦¬λ 'μ΄λ»κ²' 보λ€λ '무μμ'μ μ΄μ μ λ§μΆ° 컬λ μ μ Streams APIκ° μ 곡νλ μ°μ°λ€μ μ¬μ©ν μ μλ€.
Stream λ©μλμλ μ€κ° μ°μ°(intermediate operations)νκ³ μ΅μ’ μ°μ°(terminal operations)μ΄ μλλ° μ΅μ’ μ°μ°μ μ¬μ©ν΄μΌ μνλ κ²°κ³Ό(output)λ₯Ό μ»μ μ μλ€. μ€κ° μ°μ°μ μ§μ°λ μ°μ°μΌλ‘ μ΅μ’ μ°μ°μ΄ μνλκΈ° μ κΉμ§λ μ€κ° μ°μ°μ΄ μνλμ§ μλλ€.
- μ€κ° μ°μ°(lazy) : μ€νΈλ¦Ό λ©μλλ‘ λ€λ₯Έ μ€νΈλ¦Όμ λ°ννλ€. μ΅μ’
μ°μ°μ νΈμΆν΄μ κ²°κ³Όλ₯Ό μΆλ ₯νκΈ° μ κΉμ§ μ€νμ²λΌ μ€κ° μ°μ°μ κ³μ μΉμ΄μ μ¬μ©μ΄ κ°λ₯νλ€. μ€κ° μ°μ°μ stateless νκ³ statefulλ‘ λλ μ μλλ° λ§μ½ μ€κ° μ°μ°μ΄ μ°μ°μ νκΈ° μν΄ λ°μ΄ν° μμ€μ μ 보λ₯Ό λͺ¨λ μμμΌ νλ€λ©΄ κ·Έ μ°μ°μ stateful νλ€κ³ ν μ μλ€. μλ₯Ό λ€μ΄, filter()λ stateless νκ³ , sorted()λ stateful νλ€κ³ ν μ μλ€.
- μ) Stream<T> limit (long maxSize) : μ€νΈλ¦Όμ μΌλΆλ₯Ό μλΌλΌ λ μ¬μ©. maxSizeλ§νΌ μ€νΈλ¦Όμ μμλ₯Ό μ ννλ€.
- μ΅μ’
μ°μ°(eager) : μ€νΈλ¦Όμ μμλ₯Ό μλͺ¨ν΄μ κ²°κ³Όλ₯Ό λ§λ€μ΄ λΈλ€. μ΅μ’
μ°μ° νμμλ μ€νΈλ¦Όμ΄ λ«νκ³ λ μ΄μ μ¬μ©ν μ μλ€.
- μ) boolean anyMatch(Predicate<? super T> predicate) : returns true if any element matches the provided predicate
μ€νΈλ¦Ό μ€νΌλ μ΄μ μ μ¬μ©νλ λ°©λ²(stream pipeline)μ 3λ¨κ³λ‘ λλ μ μκ³ , μ΄ μ€ 1λ²μ§Έμ 3λ²μ§Έλ κΌ νμνλ€.
- 컬λ μ μ μ€νΈλ¦ΌννκΈ°
- λ§λ€μ΄μ€ μ€νΈλ¦Όμ μ€κ° μ°μ° μ¬μ©
- κ²°κ³Όλ¬Όμ μ΅μ’ μ°μ°μ μ¬μ©ν΄μ κ°μ Έμ€κΈ°
μ€νΈλ¦Όμ νΉμ§μ λ€μκ³Ό κ°λ€.
- μ¬μ¬μ©μ΄ λΆκ°λ₯νλ€. λ§μ½ μ€νΈλ¦Όμ λ³μμ μ μ₯ν΄ λκ³ μ¬μ¬μ©νλ €κ³ νλ©΄ exceptionμ΄ λ°μνλ€.
- μ€νΈλ¦Όμ΄ λμνλ λμμλ 컬λ μ μ λ³κ²½ν μ μλ€.
- μ€νΈλ¦Ό μ°μ°μ μλ³Έ 컬λ μ μ λ³κ²½νμ§ μλλ€.
μ€λΈμ νΈ 5μ₯νκ³ 12μ₯μ μ€νΈλ¦Όμ΄ λμμ TODOλ‘ μ μ΄λκ³ λμ΄κ°λ μ½λλ₯Ό κ°μ Έμλ€.
- 5μ₯ μ½λ
- 12μ₯ μ½λ
Lambda
λλ€μμ μ μ΄ν΄νλ©΄ Stream APIλ₯Ό λ μ½κ² μ¬μ©ν μ μλ€. λλ€μμ κ°μ²΄μ΄κ³ , single abstract methodμ νΈμΆν΄μ μ¬μ©νλ€. λλ€μμ ν¨μν μΈν°νμ΄μ€(functional interface)λ₯Ό ꡬννκ³ μκ³ ν¨μν μΈν°νμ΄μ€μλ μ€μ§ νλμ μΆμ λ©μλλ§ μ μλμ΄ μμ΄μΌ νλ€. (static λ©μλμ default λ©μλμ κ°μλ μκ΄μμ) μ΅λͺ λ΄λΆ ν΄λμ€μ λΉμ·ν¨.
ν¨μν μΈν°νμ΄μ€
- BinaryOperator<T> : method apply T νμ μ μΈμ 2κ°λ₯Ό λ°μμ T νμ μ κ°μ λ°νν¨
- Consumer<T> : method accept T νμ μ μΈμλ₯Ό λ°κ³ , λ°νκ°μ μμ
- Function<T, R> : method apply T νμ μ μΈμλ₯Ό λ°μμ R νμ μ κ°μ λ°νν¨
- Predicate<T> : method test T νμ μ μΈμλ₯Ό λ°μμ booleanμ λ°νν¨
- Supplier<T> : method get μΈμλ₯Ό λ°μ§ μκ³ , T νμ μ κ°μ λ°νν¨. μ€νΈλ¦Όμμ μ°μ°μ κ²°κ³Όλ₯Ό μ μ₯ν 컬λ μ κ°μ²΄λ₯Ό μμ±νλ λ° μ£Όλ‘ μ¬μ©λ¨
- UnaryOperator<T> : method get μΈμλ₯Ό λ°μ§ μκ³ , T νμ μ κ°μ λ°νν¨
Stream<T> filter(Predicate<? super T>predicate)
Returns a stream of the elements that match the given predicate.
<T> : the Type of the object in the stream
<R> : the type of the Result of the method
μ¬κΈ°μ <? super T>λ μμΌλ μΉ΄λμΈλ° μ¬κΈ°μμ Tλ lower boundμ΄κ³ ,
<? extends T>μμμ Tλ upper boundμ΄λ€.
μλ₯Ό λ€λ©΄, List<? super Integer>μ΄λ©΄ List<Integer>, List<Number>, κ·Έλ¦¬κ³ List<Object>κ° λ€μ΄κ° μ μλ€.
λλ€μμ λ κ°λ¨νκ² ννν μ μλ λ°©λ²μΌλ‘λ λ©μλ μ°Έμ‘° (method reference)κ° μλλ°,
νλμ λ©μλλ§ νΈμΆνλ λλ€μμ 'ν΄λμ€ μ΄λ¦::λ©μλμ΄λ¦' λλ 'μ°Έμ‘°λ³μ::λ©μλμ΄λ¦'μΌλ‘ λ°κΏ μ μλ€.
λ©μλ μ°Έμ‘°μλ 4κ°μ§ νμ μ΄ μλ€.
- instance method => String::toUpperCase String ν΄λμ€μ toUpperCase λ©μλ νΈμΆ
String::toUpperCase String ν΄λμ€μ toUpperCase λ©μλ νΈμΆ
μλ λ κ°μ λλ€μμ λ©μλ μ°Έμ‘°λ‘ λ°κΎΌ κ².
(String s) -> {return s.toUpperCase();}
s -> s.toUpperCase()
- instance method of specific object => System.out::println
- static method => Math::sqrt
- constructor => TreeMap::new κΈ°λ³Έ μμ±μ(μΈμκ° μλ)λ₯Ό νΈμΆν΄μ κ°μ²΄λ₯Ό μμ±ν λ μ¬μ©
μλ° 8μμ λλ€μ μ€νΈλ¦Όμ΄ μΆκ°λλ©΄μ functional programmingμ΄ κ°λ₯ν΄μ‘κ³ ,
λ³μλ€μ΄ immutable νκΈ° λλ¬Έμ λ°νμμμ λ°μ΄ν°μ λ¬Έμ κ° μκΈΈ νλ₯ μ΄ μ€μ΄λ€μ΄ λ©ν°μ€λ λ νκ²½μμ λ³λ ¬μ²λ¦¬νλ κ²μ μ’ λ μ½κ² λ§λ€μ΄ μ€λ€.
// TODO
λ©ν°μ€λ λ λΆλΆμ μμ§ κ³΅λΆνμ§ μμλλ°, λμ€μ μ μ΄λ κ² λλμ§ μ°Ύμλ΄μΌκ² λ€.
μ°Έκ³ μλ£
ν€λνΌμ€νΈ μλ° ch.12
μλ°μ μ μ ch.14
μ€νλ§ μ λ¬Έμ μν μλ° κ°μ²΄ μ§ν₯μ μ리μ μ΄ν΄ λΆλ‘ B.
https://docs.oracle.com/javase/8/docs/api/java/util/function/Predicate.html
https://docs.oracle.com/javase/tutorial/extra/generics/morefun.html
https://stackoverflow.com/questions/2827585/what-is-super-t-syntax
https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html