μλ
νμΈμ π€ λ°±μλ κ°λ°μ 리λΉμμ¦μ
λλ€ π
μ€λ ν¬μ€ν
μμλ μ§λ ν¬μ€ν
, μλ°μ λλ€μ μ΄μ΄μ μ€νΈλ¦Όμ λν΄μ λ€λ£¨μ΄ λ³΄λ €κ³ ν΄μ π
μ€νΈλ¦Όμ μ₯μ κ³Ό μ€νΈλ¦Όμ μ μ©ν μ μλ λ€μν μ°μ°λ€ μκ°λλ €λ³΄κ² μ΅λλ€!
μ€νΈλ¦Όμ κ°μΈ, μλ΄ λ¬Όμ€κΈ° λ±μ λ»μ κ°μ§κ³ μμ΅λλ€
κ·Έ μλ―Έμ μ°κ²°ν΄μ Modern Java in Actionμ΄λΌλ μ± μμλ λ°μ΄ν° μ²λ¦¬ μ°μ°μ μ§μνλλ‘ μμ€μμ μΆμΆλ μ°μλ μμλΌκ³ μ€λͺ νκ³ μμ£ π€
μ€νΈλ¦Όμ Java 8λΆν° λ€λμ λ°μ΄ν° μ²λ¦¬ μμ μ λκΈ° μν΄μ μΆκ°λμκ³ λ°μ΄ν° μμ€κ° λ€λ₯΄λλΌλ μΌλ¨ μ€νΈλ¦Όμ μμ±νκΈ°λ§ νλ€λ©΄ κ³Όκ±°μ κ·Έ λ°μ΄ν°μ ννκ° λ¬΄μμ΄μλ κ°μ κ°μ λ°©μμΌλ‘ λ€λ£° μ μκ² λ©λλ€.
μ΄λ‘μ¨ μ€νΈλ¦Όμ μ½λμ μ¬μ¬μ©μ±μ΄ λμμ§λ€λΌλ μ₯μ κ³Ό λ°°μ΄μ΄λ 컬λ μ μ΄λ νμΌμ΄λ Streamμ λ§λ€μ΄λ΄κΈ°λ§ νλ©΄ λμΌνκ² μ²λ¦¬ν μ μκ² λλ μ₯μ λν κ°μ§λλ€ π€
ν΄λΉ ν¬μ€ν μ μ€νΈλ¦Όμ μ¬μ© λ°©λ²μ κ΄ν΄μ μ€λͺ λ립λλ€. μ€νΈλ¦Όμ λν λ€μν μ°μ°μ μκ°λ리λλ° λͺ¨λ κ²μ μΈμ°λ €κ³ νμκΈ° λ³΄λ¨ λλμ νμ νμκ³ μ€μ λ‘ μ μ©ν΄λ³΄λ©° λ§₯λ½κ³Ό ν¨κ» νμ΅νμλ κ²μ μΆμ² λλ €μ π
μ€νΈλ¦Όμ μ¬μ©νκΈ° μν΄μ λ€μ 3λ¨κ³λ₯Ό μμμΌ ν©λλ€!
κ° μ°μ°μ μ‘°ν©ν΄μ μ¬μ©νλ μμ μ μ μ μΌλ‘ 보μ¬λ립λλ€ π
List<String> names = people.stream() // μμ±
.filter(person -> people.getAge().equals(24)) //μ€κ° μ°μ°
.map(Person::getName)//μ€κ° μ°μ°
.limit(10) //μ€κ° μ°μ°
.toList(); //μ΅μ’
μ°μ°
μ κ·ΈλΌ μ΄μ λ κ° λ¨κ³λ³λ‘ νλ² κ°μ΄ μ΄ν΄λ΄ μλ€!
λ³Έ ν¬μ€νΈμμλ λνμ μΈ μ€νΈλ¦Ό μμ± μμ€μΈ 컬λ μ
, λ°°μ΄
, μ«μ
, λλ€μ
μ μμλ‘ κ° λ¨κ³λ₯Ό μ€λͺ
λλ¦¬κ² μ΅λλ€.
λ¨Όμ μ€νΈλ¦Ό μμ±μ λλ€. λ°μ΄ν° μμ€λ‘ λΆν° μ€νΈλ¦Όμ μμ±νλ μ½λλ₯Ό μμλ‘ λ³΄μ¬λλ¦¬κ² μ΅λλ€.
컬λ μ μΌλ‘ λΆν° μ€νΈλ¦Ό μμ±νκΈ°!
컬λ μ μ μ΄λ―Έ μ€νΈλ¦Όμ μμ±ν μ μλ λ©μλ stream()μ μ 곡νκ³ μλ΅λλ€.
μ΄λ₯Ό μ¬μ©νλ©΄ μ€νΈλ¦Όμ μμ±ν μ μμ΄μ!private final List<Card> cards; private boolean hasAce() { return cards.stream().anyMatch(Card::isAce); // μ€νΈλ¦Ό μμ± λΆλΆ }
λ°°μ΄λ‘ λΆν° μ€νΈλ¦Ό μμ±νκΈ°!
λ°°μ΄ μμ μ μλμ΄μλ static methodλ₯Ό μ¬μ©ν¨μΌλ‘μ¨ μ€νΈλ¦Όμ μμ±ν μ μλ΅λλ€ π€
Arrays.stream(arr)....
μ«μλ‘λΆν° μ€νΈλ¦Ό μμ±νκΈ°!
μ«μλ‘λΆν°λ μ€νΈλ¦Όμ μμ±ν μ μμ΅λλ€! λμμ μ€νΈλ¦Όμ μμ±ν μλ μκ³ μ‘°κ±΄μ λ§μΆ μ«μ μ€νΈλ¦Όμ μμ±ν μλ μλλ°μ νλμ© μ΄ν΄λ³΄μμ£ π
- μμμ μλ₯Ό λ€μμ²λΌ μμ±ν μ μλ€.
IntStream intStream = new Random().ints();
- νΉμ λ²μμ μ°μλ μ μλ₯Ό λ€μ μ²λΌ μμ±ν μ μλ€.
IntStream intStream1 = IntStream.range(1,5); //1,2,3,4 IntStream intStream2 = IntStream.rangeClosed(1,5); //1,2,3,4,5
- νΉμ λ²μμ λμλ₯Ό λ€μκ³Ό κ°μ΄ μμ±ν μ μλ€.
IntStream limitedStream = new Random().ints(10,1,10); //10μ¬μ΄μ¦μ μ€νΈλ¦Ό begin 1, end 10 IntStream unlimitedIntStream = new Random.ints(1,10); //begin1, end 10 μ¬μ΄μ¦ νΉμ μν¨
λλ€μμΌλ‘λΆν° μ€νΈλ¦Ό μμ±νκΈ°
λλ€μλ κ²°κ΅ μΈμλ₯Ό λ°μμ returnνλ λ©μλμ μΆμ½λ²μ μ΄λΌκ³ λ³Ό μ μμ΅λλ€ (μ ννλ ν¨μν μΈν°νμ΄μ€μ ꡬν체 κ΄λ ¨ μ€λͺ )
λ°λΌμ λ°λ³΅μ μΌλ‘ κ°μ μ λ¬νκ³ λ°νλλ κ°μ λͺ¨μΌλ©΄ μ€νΈλ¦Όμ μμ±ν μ μμ΅λλ€!
λλ€μμΌλ‘λΆν° μ€νΈλ¦Όμ μμ±νκΈ° μν΄μλiterate
λ©μλλgenerate
λ©μλλ₯Ό μ¬μ©ν΄μΌ ν©λλ€.
νλμ© μ΄ν΄λ΄ μλ€! λ¨Όμ iterate
π€
- iterateμ νλΌλ―Έν°λ‘ μλ κ°κ³Ό λλ€ μμ λ°λλ€.
- μλ κ°μ λλ€μμ νλΌλ―Έν°λ‘ λ€μ΄κ°λ μ μΌ μ²«λ²μ§Έ κ°μΌλ‘ κ·Έλ κ² λ°νλ κ²°κ³Όλ λ€μ λλ€μμ μ λ ₯μΌλ‘ λ€μ΄κ°κΈ°λ₯Ό λ°λ³΅νκ² λλ€.
Stream.iterate(0, n->n+2) .limit(4) .forEach(System.out::println); // 0,2,4,6
generate
μ μλ κ°μ΄ μλ€λ μ μμiterate
μ μ±κ²©μ λ¬λ¦¬νλλ°μ! νλ² μ΄ν΄λ³΄μ£
- generateλ μλ κ° μμ΄ λλ€μμ κ³μ°κ°μΌλ‘λ§ μ€νΈλ¦Όμ μμ±νλ€.
Stream<Double> randomStream = Stream.generate(Math::random); Stream<Integer> oneStream = Stream.generate(()->1); // 1, 1, 1, 1 ...
μ΄μ΄ μ€νΈλ¦Όμ λ°μ΄ν°λ₯Ό μνλ ννλ‘ κ°κ³΅νλ μ€κ° μ°μ° μκ°λλ¦¬κ² μ΅λλ€! μ 곡λλ μ¬λ¬ λ©μλ κ°μ΄λ° μ κΈ°μ€ μ£Όλ‘ μ¬μ©νλ μ€κ° μ°μ° λ©μλ 4κ°μ§λ§ μ€λͺ λ릴κ²μ! π€
distinct() : μ€νΈλ¦Όμμ μ€λ³΅λλ λ°μ΄ν°λ₯Ό μ κ±°
List<String> distinctList = stringList.stream() .distinct() //λ¬Έμμ΄μ΄ κ°μ μ€λ³΅ μμλ₯Ό μ κ±°! .collect(Collectors.toList());
filter(Predicate predicate) : 쑰건μ λ§μ‘±νλ λ°μ΄ν°λ§ λ¨κΈ°κ³ λλ¨Έμ§λ₯Ό μ μΈ
List<Integer> evenNumbers = numberList.stream() .filter(number -> number % 2 == 0) // μ§μλ§ νν°λ§ .collect(Collectors.toList());
sorted(Comparator comparator) : μ λ ¬ κΈ°μ€μΌλ‘ μ λ ¬ (μ λ ¬ κΈ°μ€ μλ€λ©΄ κΈ°λ³Έ μ λ ¬ κΈ°μ€)
List<String> sortedList = stringList.stream() .sorted() // sorted()λ₯Ό μ¬μ©νμ¬ μνλ²³μμΌλ‘ μ λ ¬ .collect(Collectors.toList());
map(Function<T,R> mapper) : μνλ νλλ§ λ½μλ΄κ±°λ, νΉμ ννλ‘ λ³ν
List<Integer> squaredNumbers = numberList.stream() .map(number -> number * number) // map()μ μ¬μ©νμ¬ κ° μ«μλ₯Ό μ κ³±νμ¬ μλ‘μ΄ λ¦¬μ€νΈ μμ± .collect(Collectors.toList());
λ§μ§λ§μΌλ‘ μνλ ννλ‘ λ°ννλλ‘ μ λνλ μ΅μ’
μ°μ°μ
λλ€!
μ΅μ’
μ°μ°μΌλ‘μ¨ μ 곡λλ μ¬λ¬ λ©μλλ€κ³Ό κ·Έ μ¬μ© λͺ¨μ΅μ 보μ¬λλ¦¬κ² μ΅λλ€ π
forEach(Consumer<? super T> action) : μ€νΈλ¦Όμ λ°μ΄ν°λ₯Ό μλͺ¨νλ©° μ£Όλ‘ μΆλ ₯νλ μ©λλ‘ μ¬μ©
//streamμ κ° μμλ₯Ό μΆλ ₯ stringList.stream().forEach(element -> System.out.println(element));
allMatch(Predicate<? super T> predicate) : λͺ¨λ μμκ° μΌμΉνλ©΄ true
// λͺ¨λ μ§μμΈμ§ νμΈ boolean allEven = numberList.stream().allMatch(number -> number % 2 == 0);
anyMatch(Predicate<? super T> predicate) : νλμ μμλ μΌμΉνλ©΄ true
// νμμΈ μμκ° μλμ§ νμΈ boolean anyOdd = numberList.stream().anyMatch(number -> number % 2 != 0);
noneMatch(Predicate<? super T> predicate) : λͺ¨λ μμκ° λΆμΌμΉνλ©΄ true
// μ΄λ€ μμλ νμκ° μλμ§ νμΈ boolean noneOdd = numberList.stream().noneMatch(number -> number % 2 != 0);
findFirst() : 쑰건μ μΌμΉνλ 첫 λ²μ§Έ μμλ₯Ό λ°ν
Optional<String> firstFilteredElement = stringList.stream() .filter(s -> s.startsWith("o")) // "o"λ‘ μμνλ λ¬Έμμ΄λ§ μ ν (μ€κ° μ°μ°) .findFirst(); // μ νλ λ¬Έμμ΄ μ€μμ 첫 λ²μ§Έ μμ μ°ΎκΈ° (μ΅μ’ μ°μ°)
findAny(): 쑰건μ μΌμΉνλ μμλ₯Ό νλ λ°ν
Optional<Integer> anyEvenNumber = numberList.stream() .filter(number -> number % 2 == 0) // μ§μμΈ μ«μλ§ μ ν (μ€κ° μ°μ°) .findAny(); // μ νλ μ«μ μ€μμ μμμ μμ μ°ΎκΈ° (μ΅μ’ μ°μ°)
collect(Collector collector) : μ€νΈλ¦Όμ μμλ₯Ό μμ§ν΄ μνλ ννλ‘ λ°ν
- Collecotr νμ μ νλΌλ―Έν°λ‘ λ°μ
- Collectorλ μΈν°νμ΄μ€μΈλ° μλ§μ μΆμ λ©μλλ₯Ό μ μν΄μΌ collect()μ νλΌλ―Έν°λ‘ μ¬μ©ν μ μμ.
- νμ§λ§ μλ§μ μΆμ λ©μλλ₯Ό μΌμΌμ΄ μ μν μλ μλ€.
- κ·Έλμ static λ©μλλ‘ λ§μ κ²μ 미리 μ μν΄μ€ Collectorsλ₯Ό μ£Όλ‘ μ΄μ©ν¨.
- μμ.collect(Collectors.toList());
λ°μ΄ν°λ₯Ό μμ§ν΄μ 리μ€νΈ ννλ‘ λ°ν
- μμ.collect(Collectors.groupingBy(person -> person.getCountry()));
personμ countryλ³λ‘ κ·Έλ£Ήν νμ¬ λ§΅μΌλ‘ λ°ν
μ§κΈκΉμ§ μ€νΈλ¦Όμ΄ 3κ°μ§ μ°μ°μ ν΅ν΄μ μ¬μ©λ μ μμμ μμ보μκ³ λ¨κ³λ³λ‘ μ€νΈλ¦Όμ μμ±νλ λ², μ€νΈλ¦Όμ μ€κ° μ°μ°μλ₯Ό λ¨Ήμ¬μ λ΄κ° μνλ λ°μ΄ν°λ‘ κ°κ³΅νλ λ², μ΅μ’ μ°μ°μ ν΅ν΄ λ΄κ° μνλ ννλ‘ λ°μμ€λ λ²μ μμ보μμ΅λλ€ π€
μ°μ°μ μ’ λ₯κ° λ§μ λ§νΌ νμν λλ§λ€ μ°Ύμ보며 λ§₯λ½μμμ μ¬μ©λλ λͺ¨μ΅μ λ°λ³΅μ μΌλ‘ μ΅νλ©° μ΅μν΄μ ΈμΌ νκ² λ€μ π€