iterator_stream

Iterator

IteratorλŠ” μ»¬λ ‰μ…˜μ˜ 데이터λ₯Ό μˆœνšŒν•˜κ³  μ ‘κ·Όν•˜κΈ° μœ„ν•œ μΈν„°νŽ˜μ΄μŠ€λ‘œ, μ»¬λ ‰μ…˜ κ΅¬ν˜„μ²΄μ˜ λ‚΄λΆ€ ꡬ쑰λ₯Ό μ•Œμ§€ λͺ»ν•΄λ„, μΌκ΄€λœ λ°©μ‹μœΌλ‘œ μš”μ†Œμ— μ ‘κ·Όν•  수 있게 ν•΄μ€€λ‹€.

Iterator μΈν„°νŽ˜μ΄μŠ€μ˜ μ£Όμš” λ©”μ„œλ“œ

Iterator μΈν„°νŽ˜μ΄μŠ€λŠ” λ‹€μŒκ³Ό 같은 λ©”μ„œλ“œλ₯Ό κ°€μ§€κ³  μžˆλ‹€.

  • boolean hasNext(): λ‹€μŒ μš”μ†Œκ°€ μ‘΄μž¬ν•˜λŠ”μ§€ ν™•μΈν•˜λŠ” λ©”μ„œλ“œλ‘œ, λ‹€μŒ μš”μ†Œκ°€ 있으면 trueλ₯Ό λ°˜ν™˜ν•˜κ³ , 더 이상 μˆœνšŒν•  μš”μ†Œκ°€ μ—†μœΌλ©΄ falseλ₯Ό λ°˜ν™˜

  • E next(): λ‹€μŒ μš”μ†Œλ₯Ό λ°˜ν™˜(ν˜ΈμΆœν•  λ‹€μŒ μš”μ†Œκ°€ 없을 경우 NoSuchElementException μ˜ˆμ™Έκ°€ λ°œμƒ)

public class IteratorExample {

    public static void main(String[] args) {
        List<String> names = new ArrayList<>();
        names.add("Alice");
        names.add("Bob");
        names.add("Charlie");

        // Iterator 생성
        Iterator<String> iterator = names.iterator();

        // μˆœνšŒν•˜λ©΄μ„œ 좜λ ₯
        while (iterator.hasNext()) {
            String name = iterator.next();
            System.out.println(name);
        }
    }
}

슀트림

μžλ°” 8λΆ€ν„° λ„μž…λœ Stream은 데이터 μ†ŒμŠ€λ₯Ό μΆ”μƒν™”ν•˜κ³ , 데이터λ₯Ό μ²˜λ¦¬ν•˜λŠ” 데 μœ μš©ν•œ λ©”μ„œλ“œλ“€μ„ μ •μ˜ν•œ μΈν„°νŽ˜μ΄μŠ€λ‹€.

Iterator vs Stream

Iteratorκ°€ 데이터λ₯Ό μ–΄λ–»κ²Œ μ²˜λ¦¬ν• μ§€ λͺ…μ‹œν•˜λŠ” λͺ…λ Ήν˜•imperative 방식이라면, Stream은 무엇을 ν• μ§€λ§Œ μ„ μ–Έν•˜λŠ” μ„ μ–Έν˜• 방식이닀.

  • μ»¬λ ‰μ…˜ μš”μ†Œλ₯Ό λžŒλ‹€μ‹μ„ ν™œμš©ν•˜μ—¬ 처리 κ°€λŠ₯ν•˜λ©°, Iterator보닀 λ§Žμ€ 연산을 지원

  • 데이터 μ†ŒμŠ€(λ°°μ—΄, μ»¬λ ‰μ…˜ λ“±)κ°€ 무엇이든 λ™μΌν•œ λ°©μ‹μœΌλ‘œ 데이터λ₯Ό μ²˜λ¦¬ν•˜μ—¬ μ½”λ“œμ˜ μž¬μ‚¬μš©μ„± ν–₯상

슀트림의 νŠΉμ§•

1. 데이터 μ†ŒμŠ€ λΆˆλ³€

μŠ€νŠΈλ¦Όμ€ 데이터 μ†ŒμŠ€λ₯Ό λ³€κ²½ν•˜μ§€ μ•Šκ³ , μ—°μ‚° 결과둜 μƒˆλ‘œμš΄ μŠ€νŠΈλ¦Όμ„ λ°˜ν™˜ν•˜κ±°λ‚˜ μ΅œμ’… κ²°κ³Όλ₯Ό μƒμ„±ν•œλ‹€.

2. λ‚΄λΆ€ 반볡

μŠ€νŠΈλ¦Όμ„ μ‚¬μš©ν•˜λ©΄ λ°˜λ³΅λ¬Έμ„ λ©”μ„œλ“œ ν˜ΈμΆœμ„ 톡해 μš”μ†Œλ₯Ό μ²˜λ¦¬ν•  수 μžˆλ‹€.

3. 쀑간 μ—°μ‚°κ³Ό μ΅œμ’… μ—°μ‚°

슀트림의 연산은 νŒŒμ΄ν”„λΌμΈ(pipeline)을 κ΅¬μ„±ν•˜λ©°, 두 κ°€μ§€ μœ ν˜•μœΌλ‘œ λ‚˜λ‰œλ‹€.

  • 쀑간 μ—°μ‚°: μŠ€νŠΈλ¦Όμ„ λ°˜ν™˜ν•˜λŠ” μ—°μ‚°μœΌλ‘œ, μŠ€νŠΈλ¦Όμ— μ—°μ†ν•΄μ„œ μ—¬λŸ¬ 개의 쀑간 연산을 호좜 κ°€λŠ₯

  • μ΅œμ’… μ—°μ‚°: μŠ€νŠΈλ¦Όμ„ λ°˜ν™˜ν•˜μ§€ μ•ŠλŠ” μ—°μ‚°μœΌλ‘œ, μŠ€νŠΈλ¦Όμ— μ΅œμ’… 연산을 ν˜ΈμΆœν•˜λ©΄ 슀트림이 μ†Œλͺ¨

    • μ†Œλͺ¨ν•˜κ²Œ 되면, 더 이상 μŠ€νŠΈλ¦Όμ„ μ‚¬μš©ν•  수 μ—†μŒ

4. μ§€μ—° μ—°μ‚°

슀트림의 쀑간 연산은 μ΅œμ’… 연산이 호좜되기 μ „κΉŒμ§€λŠ” μ‹€μ œλ‘œ μˆ˜ν–‰λ˜μ§€ μ•Šκ³ , μ΅œμ’… 연산이 호좜되면 νŒŒμ΄ν”„λΌμΈμ΄ λ™μž‘ν•˜κΈ° μ‹œμž‘ν•œλ‹€.

슀트림 생성

λŒ€λΆ€λΆ„μ˜ 데이터 μ†ŒμŠ€λŠ” 슀트림으둜 λ³€ν™˜ν•  수 μžˆλ‹€.

  • Collection μΈν„°νŽ˜μ΄μŠ€: stream() λ©”μ„œλ“œκ°€ μ •μ˜λ˜μ–΄ μžˆμ–΄ μ»¬λ ‰μ…˜μ„ 슀트림으둜 λ³€ν™˜(μžμ† 클래슀 λͺ¨λ‘ μ‚¬μš© κ°€λŠ₯)

  • Arrays 클래슀: 배열을 슀트림으둜 λ³€ν™˜ν•˜λŠ” stream() λ©”μ„œλ“œκ°€ μ •μ˜λ˜μ–΄ μžˆμ–΄ 배열을 슀트림으둜 λ³€ν™˜

  • Map μΈν„°νŽ˜μ΄μŠ€: keySet(), values(), entrySet() λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ 슀트림으둜 λ³€ν™˜

  • Stream 클래슀(static λ©”μ„œλ“œ)

    • Stream.of(1, 2, 3)

    • Stream.empty()

    • Stream.concat(stream1, stream2)

  • λ¬΄ν•œ 슀트림

    • Stream.iterate(1, n -> n + 2)

    • Stream.generate(Math::random)

  • κΈ°λ³Έν˜• 슀트림

    • IntStream.range(1, 10)

    • IntStream.rangeClosed(1, 10)

슀트림의 쀑간 μ—°μ‚°

슀트림의 μ΅œμ’… μ—°μ‚°

findFirst() vs findAny()

findFirst()와 findAny() 두 λ©”μ„œλ“œ λͺ¨λ‘ 찾은 첫 번째 μš”μ†Œλ₯Ό Optional 객체둜 λ°˜ν™˜ν•˜μ§€λ§Œ, 병렬 ν™˜κ²½μ—μ„œ λ™μž‘μ΄ λ‹€λ₯΄λ‹€.

  • findFirst(): μ—¬λŸ¬ μš”μ†Œκ°€ 쑰건에 뢀합해도 Stream의 μˆœμ„œλ₯Ό κ³ λ €ν•˜μ—¬ 첫 번째 μš”μ†Œλ₯Ό λ°˜ν™˜

  • findAny(): Multiple Threadμ—μ„œ μ—¬λŸ¬ μš”μ†Œλ₯Ό μ²˜λ¦¬ν•˜λ‹€κ°€ κ°€μž₯ λ¨Όμ € 찾은 μš”μ†Œλ₯Ό λ°˜ν™˜

κΈ°λ³Έν˜• 슀트림 (Primitive Stream)

Stream<Integer>, Stream<Double> 등을 μ‚¬μš©ν•˜λ©΄ κΈ°λ³Έν˜•κ³Ό 객체 κ°„μ˜ λ³€ν™˜(λ°•μ‹±, μ–Έλ°•μ‹±) μ˜€λ²„ν—€λ“œκ°€ λ°œμƒν•  수 있기 λ•Œλ¬Έμ—, κΈ°λ³Έν˜•μ„ 직접 λ‹€λ£¨λŠ” μŠ€νŠΈλ¦Όμ„ μ‚¬μš©ν•˜λŠ” 것이 μ’‹λ‹€.

  • Stream<T>.mapToInt(ToIntFunction<T> mapper): Stream<T>λ₯Ό IntStream으둜 λ³€ν™˜ν•œ

  • IntStream.sum(), IntStream.average(): κΈ°λ³Έν˜•μ— νŠΉν™”λœ 집계 λ©”μ„œλ“œ 제곡

  • IntStream.boxed(): IntStream을 λ‹€μ‹œ Stream<Integer>둜 λ³€ν™˜

  • IntStream, LongStream, DoubleStream μ‚¬μš© κ°€λŠ₯

참고자료

Last updated

Was this helpful?