Bibi's DevLog ๐Ÿค“๐ŸŽ

[Java] ์ŠคํŠธ๋ฆผ, ์ŠคํŠธ๋ฆผ์˜ ์—ฐ์‚ฐ, Optional ๋ณธ๋ฌธ

๐Ÿ–ฅ BE ๋ฐฑ์—”๋“œ/Java ์ž๋ฐ”

[Java] ์ŠคํŠธ๋ฆผ, ์ŠคํŠธ๋ฆผ์˜ ์—ฐ์‚ฐ, Optional

๋น„๋น„ bibi 2021. 2. 23. 23:19

์ŠคํŠธ๋ฆผ Stream

์ŠคํŠธ๋ฆผ์ด๋ž€?

: ๋ฐฐ์—ด, ์ปฌ๋ ‰์…˜, ํŒŒ์ผ ๋“ฑ ์ธ์Šคํ„ด์Šค์˜ ์ €์žฅ ์š”์†Œ๋ฅผ ์‰ฝ๊ฒŒ ์ฐธ์กฐํ•˜๊ฒŒ ํ•ด ์ฃผ๋Š” ๋ฐ˜๋ณต์ž. (์ถœ์ฒ˜)

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

  • '๋ฐ์ดํ„ฐ ์†Œ์Šค์˜ ์ถ”์ƒํ™”'์˜ ์˜๋ฏธ?

    : ๋ฐ์ดํ„ฐ ์†Œ์Šค(๋ฐฐ์—ด/์ปฌ๋ ‰์…˜/ํŒŒ์ผ ..)๊ฐ€ ๋ฌด์—‡์ด๋˜ ๊ฐ„์— ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋‹ค.

    : ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ์ด ๋†’์•„์ง„๋‹ค.

// String[] ๊ณผ List<String>์ด๋ผ๋Š” ๋‘ ๋ฐ์ดํ„ฐ์†Œ์Šค
String[] strArr = {"aaa", "bbb", "ccc"};
List<String> strList = Arrays.asList(strArr);

// Stream ์ƒ์„ฑ
Stream<String> strStream1 = Arrays.stream(strArr);
Stream<String> strStream2 = strList.stream();

// Stream์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ์ •๋ ฌํ•˜์—ฌ ํ™”๋ฉด์— ์ถœ๋ ฅ (*๋ฐ์ดํ„ฐ ์†Œ์Šค๊ฐ€ ์ •๋ ฌ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค)
strStream1.sorted().forEach(System.out::println);
strStream2.sorted().forEach(System.out::println);

// Stream์—†์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ์ •๋ ฌํ•˜์—ฌ ํ™”๋ฉด์— ์ถœ๋ ฅํ•˜๋ ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ํ•ด์•ผ ํ•œ๋‹ค (*๋ฐ์ดํ„ฐ ์†Œ์Šค๊ฐ€ ์ •๋ ฌ๋œ๋‹ค)
Arrays.sort(strArr);
Collections.sort(strList);
for(String str : strArr)
    System.out.println(str);
for(String str : strList)
    System.out.println(str);

*System.out::println์€ System.out.println()์˜ ๋ฉ”์„œ๋“œ ์ฐธ์กฐ์ž„. ๋žŒ๋‹ค์‹์œผ๋กœ๋Š” (str) -> System.out.println(Str)

์ŠคํŠธ๋ฆผ์˜ ํŠน์žฅ์ 

  • ์ŠคํŠธ๋ฆผ์„ ์‚ฌ์šฉํ•œ ์ฝ”๋“œ๊ฐ€ ๋” ๊ฐ„๊ฒฐํ•˜๊ณ  ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋‹ค.

  • ์ŠคํŠธ๋ฆผ์„ ์‚ฌ์šฉํ•œ ์ฝ”๋“œ๊ฐ€ ์žฌ์‚ฌ์šฉ์„ฑ์ด ๋” ๋†’๋‹ค. (<-๋ฐ์ดํ„ฐ ์†Œ์Šค์˜ ์ถ”์ƒํ™”)

  • ์ŠคํŠธ๋ฆผ์€ ๋ฐ์ดํ„ฐ ์†Œ์Šค๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋Š”๋‹ค.

    • ์ŠคํŠธ๋ฆผ์€ ๋ฐ์ดํ„ฐ ์†Œ์Šค๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ธฐ๋งŒ ํ•  ๋ฟ, ๋ฐ์ดํ„ฐ ์†Œ์Šค๋ฅผ ์ง์ ‘ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ์ŠคํŠธ๋ฆผ์€ ์ผํšŒ์šฉ์ด๋‹ค.

    • Iterator์ฒ˜๋Ÿผ ์ผํšŒ์šฉ์ด๋ฏ€๋กœ, ํ•œ๋ฒˆ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ซํžˆ๊ณ  ๋‹ค์‹œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.
  • ์ŠคํŠธ๋ฆผ์€ ์ž‘์—…์„ ๋‚ด๋ถ€ ๋ฐ˜๋ณต์œผ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค.

    • ๋‚ด๋ถ€ ๋ฐ˜๋ณต : ๋ฐ˜๋ณต๋ฌธ์„ ๋ฉ”์„œ๋“œ์˜ ๋‚ด๋ถ€์— ์ˆจ๊ธธ ์ˆ˜ ์žˆ๋‹ค๋Š” ์˜๋ฏธ.

    • forEach()
      : ์ŠคํŠธ๋ฆผ ๋ฉ”์„œ๋“œ์˜ ํ•˜๋‚˜. ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋Œ€์ž…๋œ ๋žŒ๋‹ค์‹์„ ๋ฐ์ดํ„ฐ์†Œ์Šค์˜ ๋ชจ๋“  ์š”์†Œ์— ์ ์šฉํ•œ๋‹ค.

      ๋ฉ”์„œ๋“œ ์•ˆ์œผ๋กœ for๋ฌธ์„ ๋„ฃ์€ ๊ฒƒ๊ณผ ๊ฐ™๋‹ค. ์ˆ˜ํ–‰ํ•  ์ž‘์—…์€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›๋Š”๋‹ค.

  • ์ŠคํŠธ๋ฆผ์ด ์ œ๊ณตํ•˜๋Š” ๋‹ค์–‘ํ•œ ์—ฐ์‚ฐ์„ ํ†ตํ•ด ๋ณต์žกํ•œ ์ž‘์—…์„ ๊ฐ„๋‹จํžˆ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
    (์•„๋ž˜ '์ŠคํŠธ๋ฆผ์˜ ์—ฐ์‚ฐ' ์ฐธ๊ณ )

  • ์š”์†Œ์˜ ํƒ€์ž…์ด T์ธ ์ŠคํŠธ๋ฆผ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ Stream<T>์ด์ง€๋งŒ,
    ์˜คํ† ๋ฐ•์‹ฑ ๋ฐ ์–ธ๋ฐ•์‹ฑ์œผ๋กœ ์ธํ•œ ๋น„ํšจ์œจ์„ ์ค„์ด๊ธฐ ์œ„ํ•ด ๋ฐ์ดํ„ฐ์†Œ์Šค์˜ ์š”์†Œ๋ฅผ ๊ธฐ๋ณธํ˜•์œผ๋กœ ๋‹ค๋ฃจ๋Š” IntStream, LongStream, DoubleStream ์ŠคํŠธ๋ฆผ์ด ์ œ๊ณต๋œ๋‹ค.

    • ์ผ๋ฐ˜์ ์œผ๋กœ Stream<Integer>๋ณด๋‹ค IntStream์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ํšจ๊ณผ์ ์ด๋‹ค.
    • ๊ฐ ๊ธฐ๋ณธํƒ€์ž… ๊ฐ’์œผ๋กœ ์ž‘์—…ํ•  ๋•Œ ์œ ์šฉํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
  • ์ŠคํŠธ๋ฆผ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๋ฉด ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๊ฐ€ ์‰ฌ์›Œ์ง„๋‹ค. (๋ณ‘๋ ฌ ์ŠคํŠธ๋ฆผ)

    • ์ŠคํŠธ๋ฆผ์€ ์ž‘์—…์„ ๋ณ‘๋ ฌ์ฒ˜๋ฆฌํ•˜๋Š” fork&join ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๋‚ด๋ถ€์ ์œผ๋กœ ์‚ฌ์šฉํ•ด ์ž๋™์œผ๋กœ ์—ฐ์‚ฐ์„ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌํ•œ๋‹ค.
    • parallel() : ์ŠคํŠธ๋ฆผ์˜ ์†์„ฑ์„ ๋ณ‘๋ ฌ ์ŠคํŠธ๋ฆผ์œผ๋กœ ๋ณ€๊ฒฝํ•จ (๋ณ‘๋ ฌ๋กœ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ํ•จ)
    • sequential() : parallel()๋กœ ์„ค์ •๋œ ๋ณ‘๋ ฌ ์ŠคํŠธ๋ฆผ์„ ๋” ์ด์ƒ ๋ณ‘๋ ฌ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š๊ฒŒ ํ•จ
      (๋ชจ๋“  ์ŠคํŠธ๋ฆผ์˜ ๊ธฐ๋ณธ๊ฐ’)

์ŠคํŠธ๋ฆผ ๋งŒ๋“ค๊ธฐ

๊ฐ€์žฅ ๋จผ์ € ์ŠคํŠธ๋ฆผ์„ ์ƒ์„ฑํ•ด์•ผ ์ŠคํŠธ๋ฆผ์„ ํ†ตํ•ด ์ž‘์—…ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ŠคํŠธ๋ฆผ์˜ ๋ฐ์ดํ„ฐ์†Œ์Šค

: ๋ฐฐ์—ด, ์ปฌ๋ ‰์…˜, ์ž„์˜์˜ ์ˆ˜ ๋“ฑ ๋‹ค์–‘ํ•˜๋‹ค.

  • ์ปฌ๋ ‰์…˜

    : ์ปฌ๋ ‰์…˜์˜ ์กฐ์ƒ์ธ Collection์— stream()์ด ์ •์˜๋˜์–ด ์žˆ๋‹ค.

    Collection์˜ ์ž์† List ๋˜๋Š” Set๋ฅผ ๊ตฌํ˜„ํ•œ ์ปฌ๋ ‰์…˜ ํด๋ž˜์Šค๋“ค์€ ๋ชจ๋‘ stream()์œผ๋กœ ์ŠคํŠธ๋ฆผ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

    • stream() : ํ•ด๋‹น ์ปฌ๋ ‰์…˜์„ ์†Œ์Šคsource๋กœ ํ•˜๋Š” ์ŠคํŠธ๋ฆผ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค

      List<Integer> list = ArrayList.asList(1,2,3);
      Stream<Integer> intStream = list.stream(); // list๋ฅผ ์†Œ์Šค๋กœ ํ•˜๋Š” ์ปฌ๋ ‰์…˜ ์ƒ์„ฑ
  • ๋ฐฐ์—ด
    : ๋ฐฐ์—ด์„ ์†Œ์Šค๋กœ ์ŠคํŠธ๋ฆผ์„ ๋งŒ๋“œ๋Š” ๋ฉ”์„œ๋“œ๋Š” Stream๊ณผ Arrays์— static๋ฉ”์„œ๋“œ๋กœ ์ •์˜๋˜์–ด ์žˆ๋‹ค.

    • Stream.of(T ... values) ,Stream.of(T[])

      ๋˜๋Š” Arrays.stream(T[]), Arrays.stream(T[] array, int startInclusive, int endExclusive)

      Stream<String> strStream = Stream.of(new String[] {"a", "b", "c"});
      Stream<String> strStream = Arrays.stream(new String[] {"a", "b", "c"});
    • IntStream.of(), LongStream.of(), DoubleStream.of()

      ๋˜๋Š” Arrays.stream(int[]), Arrays.stream(long[]), Arrays.stream(double[])

      : ๊ธฐ๋ณธํ˜•(Integer, Long, Double) ๋ฐฐ์—ด์„ ์†Œ์Šค๋กœ ํ•˜๋Š” ์ŠคํŠธ๋ฆผ์„ ์ƒ์„ฑํ•˜๋Š” ๋ฉ”์„œ๋“œ

  • ํŠน์ • ๋ฒ”์œ„์˜ ์ •์ˆ˜

    : ์ง€์ •๋œ ๋ฒ”์œ„์˜ ์—ฐ์†๋œ ์ •์ˆ˜๋ฅผ ์ŠคํŠธ๋ฆผ์œผ๋กœ ์ƒ์„ฑํ•ด ๋ฐ˜ํ™˜

    • Intstream IntStream.range(int begin, int end) (end๋ฅผ ๋ฒ”์œ„์— ํฌํ•จํ•˜์ง€ ์•Š์Œ)
      IntStream IntStream.rangeClosed(int begin, int end) (end๋ฅผ ๋ฒ”์œ„์— ํฌํ•จ)
  • ์ž„์˜์˜ ์ˆ˜

    : ๋‚œ์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜๋Š” Randomํด๋ž˜์Šค์— ์„ ์–ธ๋œ ๋ฉ”์„œ๋“œ๋“ค. ํ•ด๋‹น ํƒ€์ž…์˜ ๋‚œ์ˆ˜๋กœ ์ด๋ฃจ์–ด์ง„ ์ŠคํŠธ๋ฆผ์„ ๋ฐ˜ํ™˜

    • IntStream ints(), LongStream longs(), DoubleStream doubles() (๋ฌดํ•œ ์ŠคํŠธ๋ฆผ - ํฌ๊ธฐ๊ฐ€ ์ •ํ•ด์ง€์ง€ ์•Š์Œ)
    • limit(int limit) : ๋ฌดํ•œ ์ŠคํŠธ๋ฆผ์„ ์œ ํ•œ ์ŠคํŠธ๋ฆผ์œผ๋กœ ๋งŒ๋“ค๊ณ , ํฌ๊ธฐ๋ฅผ limit๋กœ ์ œํ•œํ•˜๋Š” ๋ฉ”์„œ๋“œ
  • ๋žŒ๋‹ค์‹

    : ๋žŒ๋‹ค์‹์„ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์•„ ๋žŒ๋‹ค์‹์— ์˜ํ•ด ๊ณ„์‚ฐ๋˜๋Š” ๊ฐ’๋“ค์„ ์š”์†Œ๋กœ ํ•˜๋Š” ๋ฌดํ•œ ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ

    • static <T> Stream<T> iterate(T seed, UnaryOperator<T> f)

      : seed๋ถ€ํ„ฐ ์‹œ์ž‘, ๋žŒ๋‹ค์‹ f์— ์˜ํ•ด ๊ณ„์‚ฐ๋œ ๊ฒฐ๊ณผ๋ฅผ ๋‹ค์‹œ seed๊ฐ’์œผ๋กœ ํ•˜์—ฌ ๋ฐ˜๋ณต ๊ณ„์‚ฐ

    • static <T> Stream<T> generate(Supplier<T> s)

      : iterate()์™€ ๋น„์Šทํ•˜๋‚˜ ์ด์ „ ๊ฒฐ๊ณผ๋ฅผ ์ด์šฉํ•ด ๋‹ค์Œ ์š”์†Œ๋ฅผ ๊ณ„์‚ฐํ•˜์ง€ ์•Š์Œ.

  • ํŒŒ์ผ

    : java.nio.file.Files ์— list()๋กœ ์ •์˜๋จ.

    • Stream<Path> Files.list(Path dir) : ์ง€์ •๋œ ๋””๋ ‰ํ† ๋ฆฌ์— ์žˆ๋Š” ํŒŒ์ผ์˜ ๋ชฉ๋ก์„ ์†Œ์Šค๋กœ ํ•˜๋Š” ์ŠคํŠธ๋ฆผ์„ ์ƒ์„ฑํ•ด ๋ฐ˜ํ™˜.
    • Stream<String> Files.lines(Path path) : ํŒŒ์ผ์˜ ํ•œ ํ–‰(line)์„ ์š”์†Œ๋กœ ํ•˜๋Š” ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ

    BufferedReaderํด๋ž˜์Šค์— ์†ํ•œ ๋ฉ”์„œ๋“œ ์ค‘์—๋„ ์ŠคํŠธ๋ฆผ์„ ์ƒ์„ฑํ•˜๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ๋‹ค.

    • Stream<String> lines() : ํŒŒ์ผ ์™ธ์— ๋‹ค๋ฅธ ๋Œ€์ƒ์œผ๋กœ๋ถ€ํ„ฐ๋„ ๋ฐ์ดํ„ฐ๋ฅผ ํ–‰ ๋‹จ์œ„๋กœ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค
  • ๋นˆ ์ŠคํŠธ๋ฆผ

    : ์š”์†Œ๊ฐ€ ํ•˜๋‚˜๋„ ์—†๋Š” ๋นˆ ์ŠคํŠธ๋ฆผ์„ ์ƒ์„ฑ.

    ์ŠคํŠธ๋ฆผ์˜ ์—ฐ์‚ฐ ๊ฒฐ๊ณผ๊ฐ€ ํ•˜๋‚˜๋„ ์—†์„ ๋•Œ, null ๋Œ€์‹  ๋นˆ ์ŠคํŠธ๋ฆผ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค

    • Stream.empty() : ๋นˆ ์ŠคํŠธ๋ฆผ์„ ์ƒ์„ฑํ•ด ๋ฐ˜ํ™˜ํ•จ
  • ๋‘ ์ŠคํŠธ๋ฆผ ์—ฐ๊ฒฐ

    : ๊ฐ™์€ ํƒ€์ž…์˜ ์š”์†Œ๋ฅผ ๊ฐ€์ง„ ๋‘ ์ŠคํŠธ๋ฆผ์„ ํ•˜๋‚˜๋กœ ์—ฐ๊ฒฐํ•œ๋‹ค

    • concat(Stream<T> str1, Stream<T> str2) : ์ŠคํŠธ๋ฆผ str1, str2๋ฅผ ํ•˜๋‚˜๋กœ ์—ฐ๊ฒฐํ•จ

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

์—ฐ์‚ฐ operation : ์ŠคํŠธ๋ฆผ์— ์ •์˜๋œ ๋ฉ”์†Œ๋“œ ์ค‘ ๋ฐ์ดํ„ฐ ์†Œ์Šค๋ฅผ ๋‹ค๋ฃจ๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ.

  • ์ŠคํŠธ๋ฆผ์˜ ์—ฐ์‚ฐ์—๋Š” ์ค‘๊ฐ„ ์—ฐ์‚ฐ๊ณผ ์ตœ์ข… ์—ฐ์‚ฐ์ด ์žˆ๋‹ค.

    • ์ค‘๊ฐ„ ์—ฐ์‚ฐ : ์—ฐ์‚ฐ ๊ฒฐ๊ณผ๋ฅผ ์ŠคํŠธ๋ฆผ์œผ๋กœ ๋ฐ˜ํ™˜ํ•จ. ์ค‘๊ฐ„ ์—ฐ์‚ฐ์„ ์—ฐ์†ํ•ด์„œ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Œ.
    • ์ตœ์ข… ์—ฐ์‚ฐ : ์—ฐ์‚ฐ ๊ฒฐ๊ณผ๊ฐ€ ์ŠคํŠธ๋ฆผ์ด ์•„๋‹Œ ์—ฐ์‚ฐ. ์ŠคํŠธ๋ฆผ์˜ ์š”์†Œ๋ฅผ ์†Œ๋ชจํ•˜๋ฉด์„œ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ ๋งˆ์ง€๋ง‰์— ํ•œ ๋ฒˆ๋งŒ ์—ฐ์‚ฐ์ด ๊ฐ€๋Šฅํ•จ.
  • ์ŠคํŠธ๋ฆผ ์—ฐ์‚ฐ์—์„œ๋Š” ์ตœ์ข… ์—ฐ์‚ฐ์ด ์ˆ˜ํ–‰๋˜๊ธฐ ์ „์—๋Š” ์ค‘๊ฐ„ ์—ฐ์‚ฐ์ด ์ˆ˜ํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค.

    ์ค‘๊ฐ„์—ฐ์‚ฐ์„ ํ˜ธ์ถœํ•  ๋•Œ๋Š” ์—ฐ์‚ฐ์ด ์ˆ˜ํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค. ์–ด๋–ค ์ž‘์—…์„ ์ˆ˜ํ–‰ํ• ์ง€ ์ง€์ •ํ•œ ๊ฒƒ ๋ฟ์ด๋‹ค.

    ์ตœ์ข…์—ฐ์‚ฐ์„ ํ˜ธ์ถœํ•  ๋•Œ ์—ฐ์‚ฐ์ด ์ˆ˜ํ–‰๋˜๋ฉฐ ์ŠคํŠธ๋ฆผ์˜ ๊ฐ ์š”์†Œ๋“ค์ด ์ค‘๊ฐ„ ์š”์†Œ๋ฅผ ๊ฑฐ์ณ ์ตœ์ข… ์—ฐ์‚ฐ์—์„œ ์†Œ๋ชจ๋œ๋‹ค.

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

  • ์ŠคํŠธ๋ฆผ ์ž๋ฅด๊ธฐ

    : ์ŠคํŠธ๋ฆผ์˜ ์ผ๋ถ€๋ฅผ ์ž˜๋ผ๋‚ผ ๋•Œ ์‚ฌ์šฉ

    • skip(long n) : ์ŠคํŠธ๋ฆผ์˜ ์ฒ˜์Œ n๊ฐœ ์š”์†Œ๋ฅผ ๊ฑด๋„ˆ๋›ด๋‹ค.
    • limit(long maxSize) : ์ŠคํŠธ๋ฆผ์˜ ์š”์†Œ๋ฅผ maxSize๊ฐœ๋กœ ์ œํ•œํ•œ๋‹ค.
  • ์ŠคํŠธ๋ฆผ์˜ ์š”์†Œ ๊ฑธ๋Ÿฌ๋‚ด๊ธฐ

    • distinct() : ์ŠคํŠธ๋ฆผ์—์„œ ์ค‘๋ณต๋œ ์š”์†Œ๋“ค์„ ์ œ๊ฑฐํ•œ๋‹ค.

    • filter(Predicate<? super T> predicate) : ์ฃผ์–ด์ง„ ์กฐ๊ฑด predicate์— ๋งž์ง€ ์•Š๋Š” ์š”์†Œ๋ฅผ ๊ฑธ๋Ÿฌ๋‚ธ๋‹ค.

      (predicate์—๋Š” ์—ฐ์‚ฐ๊ฒฐ๊ณผ๊ฐ€ boolean์ธ ๋žŒ๋‹ค์‹์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค)

      ๋‹ค๋ฅธ ์กฐ๊ฑด์œผ๋กœ ์—ฌ๋Ÿฌ ๋ฒˆ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ์ŠคํŠธ๋ฆผ ์ •๋ ฌํ•˜๊ธฐ

    • sorted() : ์ŠคํŠธ๋ฆผ์„ ๊ธฐ๋ณธ ์ •๋ ฌ(์‚ฌ์ „์ˆœ) ๋กœ ์ •๋ ฌํ•œ๋‹ค.
    • Comparator ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ฉ”์„œ๋“œ๋“ค์„ ํ™œ์šฉํ•˜๋ฉด ์ •๋ ฌ์ด ์‰ฌ์›Œ์ง„๋‹ค. comparing() ๋“ฑ.
  • ๋ณ€ํ™˜

    : ์ŠคํŠธ๋ฆผ ์š”์†Œ์— ์ €์žฅ๋œ ๊ฐ’ ์ค‘์—์„œ ์›ํ•˜๋Š” ํ•„๋“œ๋งŒ ๋ฝ‘๊ฑฐ๋‚˜ ํŠน์ • ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•จ.

    • map() / mapToInt(), mapToLong(), mapToDouble() / flapMap()
  • ์กฐํšŒ

    : peek() - ์—ฐ์‚ฐ ์‚ฌ์ด์—์„œ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธ.

    • ์ฃผ๋กœ peek(a -> System.out.println(a)) ์™€ ๊ฐ™์ด ์‚ฌ์šฉ

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

์ตœ์ข…์—ฐ์‚ฐ์€ ์ŠคํŠธ๋ฆผ์˜ ์š”์†Œ๋ฅผ ์†Œ๋ชจํ•ด์„œ ๊ฒฐ๊ณผ๋ฅผ ๋งŒ๋“ ๋‹ค.

์ตœ์ข…์—ฐ์‚ฐ ํ›„์—๋Š” ์ŠคํŠธ๋ฆผ์ด ๋‹ซํžˆ๋ฉฐ ๊ทธ ์ŠคํŠธ๋ฆผ์€ ๋” ์ด์ƒ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

์ตœ์ข…์—ฐ์‚ฐ์˜ ๊ฒฐ๊ณผ๋Š” ๋‹จ์ผ ๊ฐ’ / ๋ฐฐ์—ด, ์ปฌ๋ ‰์…˜์ผ ์ˆ˜ ์žˆ๋‹ค.

  • void forEach(action) : ์ŠคํŠธ๋ฆผ์˜ ์š”์†Œ๋ฅผ ์†Œ๋ชจํ•˜๋Š” ์ตœ์ข…์—ฐ์‚ฐ.

    • forEach(System.out::println)๊ณผ ๊ฐ™์ด ์ŠคํŠธ๋ฆผ ์š”์†Œ๋ฅผ ์ถœ๋ ฅํ•  ๋•Œ ๋งŽ์ด ์‚ฌ์šฉ๋จ.
  • ์กฐ๊ฑด ๊ฒ€์‚ฌ

    : ์ŠคํŠธ๋ฆผ์˜ ์š”์†Œ์— ๋Œ€ํ•ด, ์กฐ๊ฑด๊ณผ ์š”์†Œ๋ฅผ ๋น„๊ตํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์„œ๋“œ๋“ค.

    ๋ชจ๋‘ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ Predicate(์กฐ๊ฑด)๋ฅผ ์š”๊ตฌํ•˜๋ฉฐ, ์—ฐ์‚ฐ ๊ฒฐ๊ณผ๋กœ boolean์„ ๋ฐ˜ํ™˜ํ•จ

    • boolean allMatch(predicate) : ์กฐ๊ฑด์— ๋ชจ๋“  ์š”์†Œ๊ฐ€ ์ผ์น˜ํ•˜๋Š”์ง€
    • boolean anyMatch(predicate) : ์กฐ๊ฑด์— ์ผ๋ถ€ ์š”์†Œ๊ฐ€ ์ผ์น˜ํ•˜๋Š”์ง€
    • boolean noneMatch(predicate) : ์กฐ๊ฑด์— ์–ด๋–ค ์š”์†Œ๋„ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š”์ง€
    • Optional<T> findFirst() : ์กฐ๊ฑด์— ๋งž๋Š” ์ฒซ ๋ฒˆ์งธ ์š”์†Œ๋ฅผ ๋ฐ˜ํ™˜. ์ฃผ๋กœ filter()์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ
    • Optional<T> findAny(): ๋ณ‘๋ ฌ ์ŠคํŠธ๋ฆผ์ผ ๋•Œ ์‚ฌ์šฉ.์กฐ๊ฑด์— ๋งž๋Š” ์ฒซ ๋ฒˆ์งธ ์š”์†Œ๋ฅผ ๋ฐ˜ํ™˜. ์ฃผ๋กœ filter()์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ
  • ํ†ต๊ณ„

    : ์ŠคํŠธ๋ฆผ์˜ ์š”์†Œ๋“ค์— ๋Œ€ํ•œ ํ†ต๊ณ„์ •๋ณด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๋ฉ”์„œ๋“œ๋“ค.

    ๊ธฐ๋ณธํ˜• ์ŠคํŠธ๋ฆผ(IntStream ๋“ฑ)์—์„œ ๋” ๋งŽ์€ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•˜๋ฏ€๋กœ ๋ณ€ํ™˜ํ•ด์„œ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜, reduce()/collect()๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

    • count(), sum(), average(), max(), min()
  • ๋ฆฌ๋“€์‹ฑ reduce()

    : ์ŠคํŠธ๋ฆผ์˜ ์š”์†Œ๋ฅผ ์ค„์—ฌ๋‚˜๊ฐ€๋ฉด์„œ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์ตœ์ข… ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•จ.

    ์ฒ˜์Œ ๋‘ ์š”์†Œ๋ฅผ ๊ฐ€์ง€๊ณ  ์—ฐ์‚ฐํ•œ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ง€๊ณ , ๋‹ค์Œ ์š”์†Œ์™€ ์—ฐ์‚ฐ์„ ๋ฐ˜๋ณตํ•œ๋‹ค.

    ์ŠคํŠธ๋ฆผ์˜ ๋ชจ๋“  ์š”์†Œ๋ฅผ ์†Œ๋ชจํ•˜๋ฉด ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•จ.

    • Optional<T> reduce(BinaryOperator<T> accumulator)

    • T reduce(T identity, BinaryOperator<T> accumulator) (identity์™€ ์ฒซ ์š”์†Œ๋กœ ์—ฐ์‚ฐ์„ ์‹œ์ž‘)

      identity : ์ดˆ๊ธฐ๊ฐ’, BinaryOperator : ์—ฐ์‚ฐ

      ์ดˆ๊ธฐ๊ฐ’์„ ์„ค์ •ํ•˜๊ณ , ์–ด๋–ค ์—ฐ์‚ฐ์œผ๋กœ ์ŠคํŠธ๋ฆผ์˜ ์š”์†Œ๋ฅผ ์ค„์—ฌ๋‚˜๊ฐˆ์ง€ ๊ฒฐ์ •ํ•œ๋‹ค.

    • ๋ฆฌ๋“€์‹ฑ์€ ๋‚ด๋ถ€์ ์œผ๋กœ ์•„๋ž˜์™€ ๊ฐ™์ด ๋™์ž‘ํ•œ๋‹ค.

    T reduce(T identity, BinaryOperator<T> accumulator) { 
        T a = identity;
        for(T b : stream)
            a = accumulator.apply(a, b);
        return a;
    }
    
    // ์˜ˆ๋ฅผ ๋“ค์–ด ๋ชจ๋“  ์š”์†Œ๋ฅผ ๋”ํ•˜๋Š” ๊ฒฝ์šฐ
    int a = identity 
    for(int b : stream)
        a = a + b;
  • collect()์™€ Collector

    ์ŠคํŠธ๋ฆผ์˜ ์ตœ์ข…์—ฐ์‚ฐ ์ค‘์—์„œ๋„ ๊ฐ€์žฅ ๋ณต์žกํ•˜์ง€๋งŒ ์œ ์šฉํ•˜๋‹ค.

    • collect() : ์ŠคํŠธ๋ฆผ์˜ ์š”์†Œ๋ฅผ ์ˆ˜์ง‘ํ•˜๋Š” ์ตœ์ข…์—ฐ์‚ฐ. reduce()์™€ ์œ ์‚ฌํ•˜๋‹ค.

      Object collect(Collector collector)

      ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ Collector(Collector๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค์˜ ๊ฐ์ฒด)๋ฅผ ํ•„์š”๋กœ ํ•œ๋‹ค.

      collect()๋Š” ํ•ด๋‹น ๊ฐ์ฒด์— ๊ตฌํ˜„๋œ ๋ฐฉ๋ฒ•๋Œ€๋กœ ์ŠคํŠธ๋ฆผ์˜ ์š”์†Œ๋ฅผ ์ˆ˜์ง‘ํ•œ๋‹ค.

    • Collector ์ปฌ๋ ‰ํ„ฐ : Collector ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ๊ฒƒ. collect()๋กœ ์ŠคํŠธ๋ฆผ์˜ ์š”์†Œ๋ฅผ ์–ด๋–ป๊ฒŒ ์ˆ˜์ง‘ํ• ์ง€ ๊ทธ ๋ฐฉ๋ฒ•์ด ์ •์˜๋˜์–ด ์žˆ์Œ.

      • ํ•ด๋‹น ํด๋ž˜์Šค์— ์ œ๊ณต๋˜๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ , ์ง์ ‘ Collector์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•ด ์ปฌ๋ ‰ํ„ฐ๋ฅผ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ๋‹ค.
    • Collectors : ํด๋ž˜์Šค. static๋ฉ”์„œ๋“œ๋กœ ๋ฏธ๋ฆฌ ์ž‘์„ฑ๋œ ๋‹ค์–‘ํ•œ ์ปฌ๋ ‰ํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. (Collectors.toList์ฒ˜๋Ÿผ ์‚ฌ์šฉ)

      • ์ŠคํŠธ๋ฆผ์„ ์ปฌ๋ ‰์…˜/๋ฐฐ์—ด๋กœ ๋ฐ˜ํ™˜

        : toList(), toSet(), toMap(), toCollection(), toArray()

      • ํ†ต๊ณ„

        : counting(), summingInt(), averagintInt(), maxBy(), minBy()

      • ๋ฆฌ๋“€์‹ฑ

        : reduce(), reducing()

      • ๋ฌธ์ž์—ด ๊ฒฐํ•ฉ

        : joining()

      • ๋ถ„๋ฅ˜ - ๊ทธ๋ฃนํ™” / ๋ถ„ํ• 

        (๊ทธ๋ฃนํ™” : ์ŠคํŠธ๋ฆผ์˜ ์š”์†Œ๋ฅผ ํŠน์ • ๊ธฐ์ค€-Function-์œผ๋กœ ๊ทธ๋ฃน์œผ๋กœ ๋ฌถ๊ธฐ)

        (๋ถ„ํ•  : ์ŠคํŠธ๋ฆผ์˜ ์š”์†Œ๋ฅผ ์กฐ๊ฑด-Predicate-์— ์ผ์น˜ํ•˜๋Š” ๊ทธ๋ฃน, ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๊ทธ๋ฃน 2๊ฐ€์ง€๋กœ ๋‚˜๋ˆ„๊ธฐ)

        : groupingBy(), partitioningBy()

Optional

Optional<T>๋Š” ์ œ๋„ค๋ฆญ ํด๋ž˜์Šค๋กœ, Tํƒ€์ž…์˜ ๊ฐ์ฒด๋ฅผ ๊ฐ์‹ธ๋Š” ๋ž˜ํผํด๋ž˜์Šค์ด๋‹ค. Optional ๊ฐ์ฒด์—๋Š” ๋ชจ๋“  ํƒ€์ž…์˜ ์ฐธ์กฐ๋ณ€์ˆ˜๋ฅผ ๋‹ด์„ ์ˆ˜ ์žˆ๋‹ค.

  • ์ŠคํŠธ๋ฆผ ์ตœ์ข… ์—ฐ์‚ฐ์˜ ๊ฒฐ๊ณผ๋ฅผ ๊ทธ๋ƒฅ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋Œ€์‹  Optional๊ฐ์ฒด์— ๋‹ด์•„ ๋ฐ˜ํ™˜ํ•˜๋ฉด, Optional์— ์ •์˜๋œ ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•ด ๊ฒฐ๊ณผ๋ฅผ ๊ฐ„๋‹จํžˆ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Optional๊ฐ์ฒด์—๋„ Stream์ฒ˜๋Ÿผ filter(), map(), flatMap()์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

(๊ฐœ๋…๋งŒ ๊ฐ„๋‹จํžˆ ๊ณต๋ถ€ํ•˜๊ณ  ํ•„์š”์‹œ ์ฐธ๊ณ ํ•˜๋ฉฐ ๋ณด์ถฉํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค)

Optional ๊ฐ์ฒด ์ƒ์„ฑ

  • Optional<T> optional = Optional.of(์ฐธ์กฐ๋ณ€์ˆ˜) : ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ์— ์‚ฌ์šฉ (์ฐธ์กฐ๋ณ€์ˆ˜๊ฐ€ null์ผ ๋•Œ NullPointerException ๋ฐœ์ƒ)
  • Optional<T> optional = Optilnal.ofNullable(์ฐธ์กฐ๋ณ€์ˆ˜) : ์ฐธ์กฐ๋ณ€์ˆ˜์˜ ๊ฐ’์ด null์ผ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์„ ๋•Œ ์‚ฌ์šฉ
  • Optional<T> optional = Optional.empty() : ์ฐธ์กฐ๋ณ€์ˆ˜๋ฅผ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•จ

Optional ๊ฐ์ฒด์˜ ๊ฐ’ ๊ฐ€์ ธ์˜ค๊ธฐ

  • get()
  • orElse(), orElseGet(), orElseThrow()
  • isPresent(), ifPresent()