iterator_stream

Iterator

Iterator ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Java ์ปฌ๋ ‰์…˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆœํšŒํ•˜๊ณ  ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. 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);
        }
    }
}

์ŠคํŠธ๋ฆผ

๋ฐ์ดํ„ฐ ์†Œ์Šค๋ฅผ ์ถ”์ƒํ™”ํ•˜๊ณ , ๋‹ค๋ฃจ๋Š”๋ฐ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•œ ์ธํ„ฐํŽ˜์ด์Šค

Java 8 ์ดํ›„์—๋Š” ์ŠคํŠธ๋ฆผ(Stream) API๊ฐ€ ๋„์ž…๋˜์–ด ์ปฌ๋ ‰์…˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋” ๊ฐ„๊ฒฐํ•˜๊ณ  ํ‘œํ˜„๋ ฅ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•œ๋‹ค.

  • ์ปฌ๋ ‰์…˜ ์š”์†Œ๋ฅผ ๋žŒ๋‹ค์‹์„ ํ™œ์šฉํ•˜์—ฌ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, Iterator๋ณด๋‹ค ๋งŽ์€ ์—ฐ์‚ฐ์„ ์ง€์›

  • ์ŠคํŠธ๋ฆผ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์†Œ์Šค๊ฐ€ ๋ฌด์—‡์ด๋“  ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ์–ด ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ ํ–ฅ์ƒ

class Example {

    public static void main(String[] args) {
        String[] array = {"a", "b", "c", "d", "e"};
        List<String> list = Arrays.asList(array);

        // ์ •๋ ฌ๋œ ๋Œ€์ƒ ์ถœ๋ ฅ
        Arrays.sort(array);
        for (String string : array) {
            System.out.println(string);
        }

        Collections.sort(list);
        for (String string : list) {
            System.out.println(string);
        }

        // ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ
        Stream<String> arrayStream = Arrays.stream(array);
        String<String> listStream = list.stream();

        // ์ •๋ ฌ๋œ ๋Œ€์ƒ ์ถœ๋ ฅ
        arrayStream.sorted().forEach(System.out::println);
        listStream.sorted().forEach(System.out::println);
    }
}

๋‘ ๊ฐœ์˜ Stream ๋ฐ์ดํ„ฐ ์†Œ์Šค๋Š” ๋‹ค๋ฅด์ง€๋งŒ, ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ •๋ ฌํ•˜๊ณ  ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๊ณ , ๋˜ํ•œ ๋ฐ์ดํ„ฐ ์†Œ์Šค๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ ๋„ ์ •๋ ฌ๋œ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

์ŠคํŠธ๋ฆผ์˜ ํŠน์ง•

1. ๋ฐ์ดํ„ฐ ์†Œ์Šค ๋ถˆ๋ณ€

์ŠคํŠธ๋ฆผ์€ ๋ฐ์ดํ„ฐ ์†Œ์Šค๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ ์†Œ์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

class Example {

    public static void main(String[] args) {
        List<String> list = Arrays.asList("a", "c", "d", "b", "e");
        List<String> sortedList = list
                .stream()
                .sorted()
                .collect(Collectors.toList()); // list๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Œ
    }
}

2. ๋‚ด๋ถ€ ๋ฐ˜๋ณต

์ŠคํŠธ๋ฆผ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ˜๋ณต๋ฌธ์„ ๋ฉ”์„œ๋“œ์˜ ๋‚ด๋ถ€์— ์ˆจ๊ธธ ์ˆ˜ ์žˆ์–ด ์ฝ”๋“œ๊ฐ€ ๊ฐ„๊ฒฐํ•ด ์ง„๋‹ค.

class Example {

    public static void main(String[] args) {
        List<String> list = Arrays.asList("a", "b", "c", "d", "e");

        // ์™ธ๋ถ€ ๋ฐ˜๋ณต
        for (String string : list) {
            System.out.println(string);
        }

        // ๋‚ด๋ถ€ ๋ฐ˜๋ณต
        list.stream().forEach(System.out::println);
    }
}

3. ์ค‘๊ฐ„ ์—ฐ์‚ฐ๊ณผ ์ตœ์ข… ์—ฐ์‚ฐ

  • ์ค‘๊ฐ„ ์—ฐ์‚ฐ: ์ŠคํŠธ๋ฆผ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ์—ฐ์‚ฐ์œผ๋กœ, ์ŠคํŠธ๋ฆผ์— ์—ฐ์†ํ•ด์„œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ค‘๊ฐ„ ์—ฐ์‚ฐ์„ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ์ตœ์ข… ์—ฐ์‚ฐ: ์ŠคํŠธ๋ฆผ์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋Š” ์—ฐ์‚ฐ์œผ๋กœ, ์ŠคํŠธ๋ฆผ์— ์ตœ์ข… ์—ฐ์‚ฐ์„ ํ˜ธ์ถœํ•˜๋ฉด ์ŠคํŠธ๋ฆผ์„ ์†Œ๋ชจํ•˜๊ฒŒ ๋œ๋‹ค.

class Example {

    public static void main(String[] args) {
        List<String> list = Arrays.asList("a", "b", "c", "d", "e");

        Stream<String> stream = list.stream();
        stream.sorted(); // ์ค‘๊ฐ„ ์—ฐ์‚ฐ
        stream.forEach(System.out::println); // ์ตœ์ข… ์—ฐ์‚ฐ
    }
}

4. ์ผํšŒ์„ฑ

์ตœ์ข… ์—ฐ์‚ฐ์„ ํ˜ธ์ถœํ•˜๋ฉด ์ŠคํŠธ๋ฆผ์„ ์†Œ๋ชจํ•˜๊ฒŒ ๋˜๋ฉฐ, ์ดํ›„์—๋Š” ์ŠคํŠธ๋ฆผ์„ ๋‹ค์‹œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค. ์—ฌ๊ธฐ์„œ ๋ฐ์ดํ„ฐ ์†Œ์Šค๋Š” ๋ถˆ๋ณ€์„ฑ ํŠน์ง•์„ ๊ฐ€์ง€๊ธฐ ๋•Œ๋ฌธ์—, ์†Œ์Šค๋Š” ๋ณ€๊ฒฝ๋˜๊ฑฐ๋‚˜ ์‚ฌ๋ผ์ง€์ง€ ์•Š๋Š”๋‹ค.

class Example {

    public static void main(String[] args) {
        List<String> list = Arrays.asList("a", "b", "c", "d", "e");

        Stream<String> stream = list.stream();
        stream.sorted().forEach(System.out::println);
        stream.sorted().forEach(System.out::println); // IllegalStateException
    }
}

5. ์ง€์—ฐ ์—ฐ์‚ฐ

์ŠคํŠธ๋ฆผ์˜ ์ตœ์ข… ์—ฐ์‚ฐ์ด ํ˜ธ์ถœ๋˜๊ธฐ ์ „๊นŒ์ง€๋Š” ์ค‘๊ฐ„ ์—ฐ์‚ฐ์ด ์‹ค์ œ๋กœ ์ˆ˜ํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค.

์ŠคํŠธ๋ฆผ ์ƒ์„ฑ

๋Œ€๋ถ€๋ถ„์˜ ๋ฐ์ดํ„ฐ ์†Œ์Šค๋Š” ์ŠคํŠธ๋ฆผ์œผ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • Collection ์ธํ„ฐํŽ˜์ด์Šค: stream() ๋ฉ”์„œ๋“œ๊ฐ€ ์ •์˜๋˜์–ด ์žˆ์–ด ์ปฌ๋ ‰์…˜์„ ์ŠคํŠธ๋ฆผ์œผ๋กœ ๋ณ€ํ™˜(์ž์† ํด๋ž˜์Šค ๋ชจ๋‘ ์‚ฌ์šฉ ๊ฐ€๋Šฅ)

  • Arrays ํด๋ž˜์Šค: ๋ฐฐ์—ด์„ ์ŠคํŠธ๋ฆผ์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” stream() ๋ฉ”์„œ๋“œ๊ฐ€ ์ •์˜๋˜์–ด ์žˆ์–ด ๋ฐฐ์—ด์„ ์ŠคํŠธ๋ฆผ์œผ๋กœ ๋ณ€ํ™˜

  • Map ์ธํ„ฐํŽ˜์ด์Šค: keySet(), values(), entrySet() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ŠคํŠธ๋ฆผ์œผ๋กœ ๋ณ€ํ™˜

class Example {

    public static void main(String[] args) {
        List<String> list = Arrays.asList("a", "b", "c", "d", "e");
        Stream<String> stream1 = list.stream();

        String[] array = {"a", "b", "c", "d", "e"};
        Stream<String> stream2 = Arrays.stream(array);

        Map<String, Integer> map = new HashMap<>() {{
            put("a", 1);
            put("b", 2);
            put("c", 3);
        }};
        Stream<Map.Entry<String, Integer>> streamEntry = map.entrySet().stream();
        Stream<String> streamKey = map.keySet().stream();
        Stream<Integer> streamValue = map.values().stream();
    }
}

๊ทธ ์™ธ์— ์•„๋ž˜์™€ ๊ฐ™์ด ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ์ŠคํŠธ๋ฆผ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค

class StreamCreationExample {

    public static void main(String[] args) {
        // ํŠน์ • ๋ฒ”์œ„์˜ ์ •์ˆ˜ ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ
        IntStream range = IntStream.range(1, 10);

        // ๋‚œ์ˆ˜ ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ
        IntStream randomStream = new Random().ints(1, 10).limit(10);

        // ๋žŒ๋‹ค์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ
        Stream<Integer> iterateStream = Stream.iterate(1, n -> n + 2).limit(10); // ๋žŒ๋‹ค์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ
        Stream<Double> generateStream = Stream
                .generate(Math::random)
                .limit(10); // Supplier ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ

        // ๋นˆ ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ
        Stream<Object> emptyStream = Stream.empty();

        // ๋‘ ์ŠคํŠธ๋ฆผ ์—ฐ๊ฒฐ
        Stream<Integer> concatStream = Stream.concat(Stream.of(1, 2, 3), Stream.of(4, 5, 6));
    }
}

์ŠคํŠธ๋ฆผ์˜ ์ค‘๊ฐ„ ์—ฐ์‚ฐ

์ŠคํŠธ๋ฆผ์˜ ์ค‘๊ฐ„ ์—ฐ์‚ฐ์œผ๋กœ๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฒƒ๋“ค์ด ์žˆ๋‹ค.

class IntermediateOperationsExample {

    public static void main(String[] args) {
        // skip()์™€ limit(): ์š”์†Œ ๊ฑด๋„ˆ๋›ฐ๊ธฐ์™€ ์ œํ•œ
        Stream.of(1, 2, 3, 4, 5)
                .skip(2)
                .limit(2)
                .forEach(System.out::println);

        // filter()์™€ distinct(): ์š”์†Œ ๊ฑธ๋Ÿฌ๋‚ด๊ธฐ์™€ ์ค‘๋ณต ์ œ๊ฑฐ
        Stream.of(1, 2, 3, 4, 5, 1, 2, 3)
                .filter(i -> i % 2 == 0)
                .distinct()
                .forEach(System.out::println);

        // sorted(): ์š”์†Œ ์ •๋ ฌ
        Stream.of(5, 2, 1, 4, 3)
                .sorted()
                .forEach(System.out::println);

        // map(): ์š”์†Œ ๋ณ€ํ™˜
        Stream.of(1, 2, 3, 4, 5)
                .map(i -> i * 2)
                .forEach(System.out::println);

        // peek(): ์š”์†Œ ํ™•์ธ (์†Œ๋น„ํ•˜์ง€ ์•Š์Œ)
        Stream.of(1, 2, 3, 4, 5)
                .peek(System.out::println)
                .forEach(System.out::println);

        // mapToInt(), mapToLong(), mapToDouble(): ๊ธฐ๋ณธํ˜• ์ŠคํŠธ๋ฆผ์œผ๋กœ ๋ณ€ํ™˜
        Stream.of(1, 2, 3, 4, 5)
                .mapToInt(Integer::intValue)
                .forEach(System.out::println);

        // flatMap(): ์ŠคํŠธ๋ฆผ์˜ ์š”์†Œ๋ฅผ ๋‹ค๋ฅธ ์ŠคํŠธ๋ฆผ์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์—ฐ์‚ฐ
        String[] lineArr = {
                "Believe or not It is true",
                "Do or do not There is no try"
        };

        Stream<String> lineStream = Stream.of(lineArr);
        Stream<Stream<String>> strArrStream = lineStream.map(line -> Stream.of(line.split(" +")));
        strArrStream.map(strStream -> Arrays.toString(strStream.toArray(String[]::new)))
                .forEach(System.out::println);
        // [[Believe, or, not, It, is, true], [Do, or, do, not, There, is, no, try]]

        lineStream = Stream.of(lineArr);
        Stream<String> stream = lineStream.flatMap(line -> Stream.of(line.split(" +")));
        stream.forEach(System.out::println);
        // [Believe, or, not, It, is, true, Do, or, do, not, There, is, no, try]
    }
}

์ŠคํŠธ๋ฆผ์˜ ์ตœ์ข… ์—ฐ์‚ฐ

์ŠคํŠธ๋ฆผ์˜ ์š”์†Œ๋ฅผ ์†Œ๋ชจํ•ด ๊ฒฐ๊ณผ๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๊ณ , ์ตœ์ข… ์—ฐ์‚ฐ ํ›„์—๋Š” ์Šคํ‹€๋ฏธ์ด ๋‹ซํžˆ๊ฒŒ ๋˜์–ด ๋” ์ด์ƒ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค. ๊ฒฐ๊ณผ๋กœ๋Š” ๋‹จ์ผ ๊ฐ’์ด๊ฑฐ๋‚˜ ์ŠคํŠธ๋ฆผ์˜ ์š”์†Œ๊ฐ€ ๋‹ด๊ธด ๋ฐฐ์—ด ๋˜๋Š” ์ปฌ๋ ‰์…˜์ผ ์ˆ˜ ์žˆ๋‹ค.

class TerminalOperationsExample {

    public static void main(String[] args) {
        // forEach(): ์ŠคํŠธ๋ฆผ ์š”์†Œ๋ฅผ ์†Œ๋ชจํ•˜๋ฉด์„œ ์ž‘์—… ์ˆ˜ํ–‰
        Stream.of(1, 2, 3, 4, 5).forEach(System.out::println);

        // allMatch(), anyMatch(), noneMatch(): ์š”์†Œ์— ๋Œ€ํ•ด ์ง€์ •๋œ ์กฐ๊ฑด์— ๋งž๋Š”์ง€ ๊ฒ€์‚ฌํ•˜๋Š” ์—ฐ์‚ฐ์œผ๋กœ boolean ๊ฐ’์„ ๋ฐ˜ํ™˜
        Stream.of(1, 2, 3, 4, 5).allMatch(i -> i > 0); // true
        Stream.of(1, 2, 3, 4, 5).anyMatch(i -> i > 2); // true
        Stream.of(1, 2, 3, 4, 5).noneMatch(i -> i > 0); // false

        // findFirst()์™€ findAny(): ์ŠคํŠธ๋ฆผ์˜ ์š”์†Œ ์ค‘์—์„œ ์ฐพ์€ ์ฒซ ๋ฒˆ์งธ ์š”์†Œ๋ฅผ `Optional` ๊ฐ์ฒด๋กœ ๋ฐ˜ํ™˜(์ฐพ์ง€ ๋ชปํ•˜๋ฉด empty ์ƒํƒœ์˜ `Optional` ๊ฐ์ฒด ๋ฐ˜ํ™˜)
        Stream.of(1, 2, 3, 4, 5).findFirst(); // Optional[1]
        Stream.of(1, 2, 3, 4, 5).findAny(); // Optional[1]

        // reduce(): ์ŠคํŠธ๋ฆผ์˜ ์š”์†Œ๋ฅผ ํ•˜๋‚˜์”ฉ ์†Œ๋ชจํ•˜๋ฉด์„œ ์ง€์ •๋œ ๋žŒ๋‹ค์‹์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์—ฐ์‚ฐ์œผ๋กœ `Optional` ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜
        // reduce()๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด sum(), max(), min() ๋“ฑ์˜ ์ง‘๊ณ„ ์—ฐ์‚ฐ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
        Stream.of(1, 2, 3, 4, 5).reduce((a, b) -> a + b); // Optional[15]

        // count(), max(), min(): ์ŠคํŠธ๋ฆผ์˜ ์š”์†Œ๋ฅผ ์†Œ๋ชจํ•˜๋ฉด์„œ ์ง€์ •๋œ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๊ณ , ์ตœ์ข… ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜
        Stream.of(1, 2, 3, 4, 5).count(); // 5
        Stream.of(1, 2, 3, 4, 5).max(Integer::compareTo); // Optional[5]
        Stream.of(1, 2, 3, 4, 5).min(Integer::compareTo); // Optional[1]

        // collect(): ์ŠคํŠธ๋ฆผ์˜ ์š”์†Œ๋ฅผ ์ˆ˜์ง‘ํ•˜๋Š” ์—ฐ์‚ฐ์œผ๋กœ, `Collector`๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์•„ ๋ฐ›์€ ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋ฐ˜ํ™˜
        List<Integer> list = Stream.of(1, 2, 3, 4, 5).collect(Collectors.toList());
        Set<Integer> set = Stream.of(1, 2, 3, 4, 5).collect(Collectors.toSet());
    }
}

findFirst() vs findAny()

findFirst()์™€ findAny() ๋‘ ๋ฉ”์„œ๋“œ ๋ชจ๋‘ ์ฐพ์€ ์ฒซ ๋ฒˆ์งธ ์š”์†Œ๋ฅผ Optional ๊ฐ์ฒด๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ๋ณ‘๋ ฌ ํ™˜๊ฒฝ์—์„œ ์ฒ˜๋ฆฌ๋ฅผ ํ•  ๋•Œ๋Š” ๋‘ ๋ฉ”์„œ๋“œ์— ์•„๋ž˜์™€ ๊ฐ™์€ ์ฐจ์ด๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค.

  • findFirst(): ์—ฌ๋Ÿฌ ์š”์†Œ๊ฐ€ ์กฐ๊ฑด์— ๋ถ€ํ•ฉํ•ด๋„ Stream์˜ ์ˆœ์„œ๋ฅผ ๊ณ ๋ คํ•˜์—ฌ ์ฒซ ๋ฒˆ์งธ ์š”์†Œ๋ฅผ ๋ฐ˜ํ™˜

  • findAny(): Multiple Thread์—์„œ ์—ฌ๋Ÿฌ ์š”์†Œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋‹ค๊ฐ€ ๊ฐ€์žฅ ๋จผ์ € ์ฐพ์€ ์š”์†Œ๋ฅผ ๋ฐ˜ํ™˜

class FindFirstAndFindAnyExample {

    public static void main(String[] args) {
        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

        Optional<Integer> findFirst = list.stream().parallel().filter(i -> i % 2 == 0).findFirst();
        Optional<Integer> findAny = list.stream().parallel().filter(i -> i % 2 == 0).findAny();

        System.out.println(findFirst.get()); // 2
        System.out.println(findAny.get()); // 2, 4, 6, 8, 10 ์ค‘ ํ•˜๋‚˜
    }
}

์ฐธ๊ณ ์ž๋ฃŒ

Last updated