Item 47. Return Collection or Stream

λ°˜ν™˜ νƒ€μž…μœΌλ‘œλŠ” μŠ€νŠΈλ¦Όλ³΄λ‹€ μ»¬λ ‰μ…˜μ΄ λ‚«λ‹€

λ©”μ„œλ“œ λ°˜ν™˜ νƒ€μž…μœΌλ‘œλŠ” 주둜 μ»¬λ ‰μ…˜ μΈν„°νŽ˜μ΄μŠ€λ‚˜ Iterable, ν˜Ήμ€ 배열이 μ‚¬μš©λœλ‹€. 슀트림 νƒ€μž… μ—­μ‹œ λ°˜ν™˜ν•  수 μžˆμ§€λ§Œ λ°˜ν™˜ 된 μŠ€νŠΈλ¦Όμ€ for-each둜 λ°˜λ³΅ν•  수 μ—†μ–΄ ꢌμž₯ν•˜μ§€ μ•ŠλŠ”λ‹€.(λ©”μ„œλ“œ μ°Έμ‘° + ν˜•λ³€ν™˜μ„ μ‚¬μš©ν•˜λ©΄ 되긴 ν•˜μ§€λ§Œ, λΉ„νš¨μœ¨μ )

class Example {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("a");
        list.add("b");
        list.add("c");

        // μ»¬λ ‰μ…˜ μΈν„°νŽ˜μ΄μŠ€ λ°˜ν™˜
        Collection<String> collection = list;
        for (String s : collection) {
            System.out.println(s);
        }

        // Iterable λ°˜ν™˜
        Iterable<String> iterable = list;
        for (String s : iterable) {
            System.out.println(s);
        }

        // λ°°μ—΄ λ°˜ν™˜
        String[] array = list.toArray(new String[0]);
        for (String s : array) {
            System.out.println(s);
        }

        // 슀트림 λ°˜ν™˜
        Stream<String> stream = list.stream();
        for (String s : stream) { // 컴파일 μ—λŸ¬
            System.out.println(s);
        }

        for (String s : (Iterable<String>) stream::iterator) { // ν˜•λ³€ν™˜ + λ©”μ„œλ“œ μ°Έμ‘°, λΉ„νš¨μœ¨μ 
            System.out.println(s);
        }

        for (String s : iterableOf(stream)) { // λ©”μ„œλ“œλ₯Ό λ§Œλ“€μ–΄ μ‚¬μš©
            System.out.println(s);
        }
    }

    public static <E> Iterable<E> iterableOf(Stream<E> stream) {
        return stream::iterator;
    }
}

λ§Œμ•½ 였직 슀트림 νŒŒμ΄ν”„λΌμΈμ—λ§Œ μ“°μ΄λŠ” 경우라면 μŠ€νŠΈλ¦Όμ„ λ°˜ν™˜ν•΄λ„ λ˜μ§€λ§Œ, κ·Έλ ‡μ§€ μ•Šμ€ 경우 Iterable을 λ°˜ν™˜ν•˜λŠ” 것이 μ’‹λ‹€.

Collection μΈν„°νŽ˜μ΄μŠ€

Collection μΈν„°νŽ˜μ΄μŠ€λŠ” Iterable의 ν•˜μœ„ μΈν„°νŽ˜μ΄μŠ€μ΄λ©΄μ„œ stream λ©”μ„œλ“œλ₯Ό μ œκ³΅ν•œλ‹€. 떄문에 Collection μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ°˜ν™˜ν•˜λ©΄ μ»¬λ ‰μ…˜μ„ λ°˜λ³΅ν•  수 있고, μŠ€νŠΈλ¦ΌμœΌλ‘œλ„ μ‚¬μš©ν•  수 있기 λ•Œλ¬Έμ— λ°˜ν™˜ νƒ€μž…μœΌλ‘œλŠ” Collection μΈν„°νŽ˜μ΄μŠ€κ°€ μ΅œμ„ μ΄λΌκ³  ν•  수 μžˆλ‹€.

λ§Œμ•½ μ‹œν€€μŠ€μ˜ 크기가 크지 μ•Šλ‹€λ©΄ ArrayListλ‚˜ HashSet 같은 ν‘œμ€€ μ»¬λ ‰μ…˜ κ΅¬ν˜„μ²΄λ₯Ό λ°˜ν™˜ν•΄λ„ μ’‹μ§€λ§Œ, 큰 μ‹œν€€μŠ€μΈ 경우 Collection μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ 클래슀λ₯Ό λ°˜ν™˜ν•˜λŠ” 것은 μ’‹μ§€ μ•Šλ‹€. 예λ₯Ό λ“€μ–΄ 멱집합을 κ΅¬ν•˜λŠ” λ©”μ„œλ“œμ˜ 경우 2^n개의 μ›μ†Œλ₯Ό κ°€μ§„ Collection을 λ°˜ν™˜ν•˜κ²Œ λ˜λŠ”λ°, 이 경우 ArrayListλ₯Ό λ°˜ν™˜ν•˜λ©΄ λ©”λͺ¨λ¦¬λ₯Ό 많이 μ‚¬μš©ν•˜κ²Œ λœλ‹€.

μ „μš© μ»¬λ ‰μ…˜

λ§Œμ•½ λ°˜ν™˜ν•˜λŠ” μ»¬λ ‰μ…˜μ΄ ν¬μ§€λ§Œ ν‘œν˜„μ„ κ°„κ²°ν•˜κ²Œ ν•  수 μžˆλ‹€λ©΄ μ „μš© μ»¬λ ‰μ…˜μ„ λ§Œλ“€μ–΄ λ°˜ν™˜ν•˜λŠ” 것도 쒋은 방법이닀. AbstractListλ₯Ό μ΄μš©ν•˜μ—¬ μ „μš© μ»¬λ ‰μ…˜μ„ λ§Œλ“  μ˜ˆμ‹œ μ½”λ“œλŠ” λ‹€μŒκ³Ό κ°™λ‹€.

멱집합을 κ΅¬ν•΄μ•Όν•˜λŠ” 경우 항상 λͺ¨λ“  μ»¬λ ‰μ…˜ μš”μ†Œλ₯Ό λ©”λͺ¨λ¦¬μƒμ— μ˜¬λ¦¬λŠ” 것보단, ν•„μš”ν•œ μ‹œμ μ— μš”μ†Œλ₯Ό λ§Œλ“€μ–΄ λ°˜ν™˜ν•˜λŠ” 방법을 μ‚¬μš©ν•˜κ³  μžˆλ‹€.

κ²°λ‘ 

λͺ¨λ“  κ²½μš°μ— μ»¬λ ‰μ…˜μ„ λ°˜ν™˜ν•˜λŠ” 것이 μ΅œμ„ μ€ μ•„λ‹ˆμ§€λ§Œ, λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ λ°˜ν™˜ 받은 ν΄λΌμ΄μ–ΈνŠΈλŠ” 이λ₯Ό μ–΄λ–€ λ°©μ‹μœΌλ‘œ μ²˜λ¦¬ν•  μ§€ λͺ¨λ₯Έλ‹€. λ•Œλ¬Έμ— λŒ€λΆ€λΆ„μ˜ 경우, 슀트림과 λ°˜λ³΅μ„ λͺ¨λ‘ μ‚¬μš©ν•  수 μžˆλŠ” Collection μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ°˜ν™˜ν•˜λŠ” 것이 μ’‹λ‹€.

Last updated

Was this helpful?