๐Ÿ”ญ
Ellery's study archive
Resume(์ˆ˜์ •์ค‘)GithubTistory
  • framework, library
    • Spring core
      • ์Šคํ”„๋ง ํŠธ๋ผ์ด์•ต๊ธ€ - POJO, IOC/DI, AOP, PSA
      • Servlet
    • Spring MVC
      • DispatcherServlet
      • Validation
    • Spring Boot
    • Spring Security
    • Spring Batch
    • Spring Webflux
    • JPA
    • JUnit, Spring Test
    • etc
      • Slf4j MDC(Mapped Diagnostic Context)
  • ETC, ๊ฐœ๋ฐœ ํŒ๋“ค
    • ๊ฐœ๋ฐœ ํŒ๋“ค
      • ์Šคํ”„๋ง ํ”„๋กœ์ ํŠธ init ์‹œ์— ํ•ด์•ผ๋  ๊ฒƒ๋“ค
      • vim ํ•œ๊ธ€ ๊นจ์งˆ ๋•Œ ์ธ์ฝ”๋”ฉ ๋ฐฉ์‹ ์ง€์ •
      • EC2 ssh connection ์‰ฝ๊ฒŒ ํ•˜๊ธฐ
      • ๋ฆฌ๋ˆ…์Šค ์ปค๋งจ๋“œ, netstats
      • Forkํ•œ ๋ ˆํฌ์ง€ํ† ๋ฆฌ origin ์—…๋ฐ์ดํŠธ
      • git merge, rebase
      • Intellij ์ž์ฃผ ์“ฐ๋Š” ๊ธฐ๋Šฅ ๋‹จ์ถ•ํ‚ค
      • JSON handling
      • aws user-data.sh
    • Lombok annotation, ๊ถŒ์žฅ ๋ฐฉ์‹
    • DB ๋ชจ๋ธ๋ง ์‹œ์— ์ธ์กฐ ์‹๋ณ„์ž ์ •์˜ํ•˜๋Š” ์ผ€์ด์Šค
    • Redis pub/sub vs Apache kafka
  • Language
    • Java
      • ์ž๋ฐ” ๋ฒ„์ ผ๋ณ„ feature
      • JVM architecture
      • Garbage collection
      • Java String pool
      • java 8 Concurrent
      • Optional
      • Stream
      • Comparator, Comparator
      • Error, Exception
      • Java์˜ Call by value(pass by value)
      • Java ๋ณ€์ˆ˜ ๊ฐ„ ๊ฐ’ Swap ๋ฐฉ์‹ 5๊ฐ€์ง€
    • Javascript
      • ์ž์ฃผ ์“ฐ๋Š” ES6 ๋ฌธ๋ฒ• ์ •๋ฆฌ
      • ES6 module
      • ES6 proxy
      • scope, var closure ์ด์Šˆ, let, const
    • Python
      • @lru_cache
  • CS
    • OS
      • Process, Thread
      • CPU scheduling
      • sync vs async, blocking vs nonblocking
      • Memory segmentation
      • virtual memory
      • ํŽ˜์ด์ง€ ๊ต์ฒด ์•Œ๊ณ ๋ฆฌ์ฆ˜
    • Network
      • UDP
      • TCP
      • DNS
      • HTTP
      • web server, WAS
      • Proxy, Load balancer
      • web socket, WebRTC
      • gRPC
      • web secure
    • DB
      • MySQL
      • index
      • ์ •๊ทœํ™”
      • DB ํŠธ๋žœ์žญ์…˜, ๋™์‹œ์„ฑ ์ œ์–ด ๋ฌธ์ œ
      • ํด๋Ÿฌ์Šคํ„ฐ๋ง
      • ๋ ˆํ”Œ๋ฆฌ์ผ€์ด์…˜
      • ์ƒค๋”ฉ
    • Data Structure, Algorithm
      • AVL tree, Red black tree
      • B-tree, B*tree, B+tree
      • Hash
    • Design pattern
      • SOLID
      • ์ƒ์„ฑ ํŒจํ„ด
        • ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด
        • ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ ํŒจํ„ด
        • ๋นŒ๋” ํŒจํ„ด
        • Null ๊ฐ์ฒด ํŒจํ„ด
      • ๊ตฌ์กฐ ํŒจํ„ด
        • ํผ์‚ฌ๋“œ ํŒจํ„ด
        • ํ”„๋ก์‹œ ํŒจํ„ด
        • ์–ด๋Œ‘ํ„ฐ ํŒจํ„ด
        • ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ํŒจํ„ด
      • ํ–‰์œ„ ํŒจํ„ด
        • ์ „๋žต ํŒจํ„ด
        • ํ…œํ”Œ๋ฆฟ ๋ฉ”์„œ๋“œ ํŒจํ„ด
        • ์ƒํƒœ ํŒจํ„ด
        • ์˜ต์ €๋ฒ„ ํŒจํ„ด
  • ์†Œํ”„ํŠธ์›จ์–ด ์•„ํ‚คํ…์ณ
    • Layered Architecture
    • ํด๋ฆฐ ์•„ํ‚คํ…์ณ
    • DDD
    • etc
      • DTO vs VO
  • ๊ฐœ๋ฐœ ์„œ์ ๋“ค
    • ์†ŒํŠธ์›์Šค ์•ค์†”๋กœ์ง€์—์„œ ์†Œ๊ฐœ๋˜๋Š” ๊ฐ์ฒด์ง€ํ–ฅ ์ƒํ™œ ์ฒด์กฐ ์›์น™ ๊ฐ„๋žต ์ •๋ฆฌ
    • ์—˜๋ ˆ๊ฐ•ํŠธ ์˜ค๋ธŒ์ ํŠธ - ์ƒˆ๋กœ์šด ๊ด€์ ์—์„œ ๋ฐ”๋ผ๋ณธ ๊ฐ์ฒด์ง€ํ–ฅ
    • ๋งŒ๋“ค๋ฉด์„œ ๋ฐฐ์šฐ๋Š” ํด๋ฆฐ ์•„ํ‚คํ…์ณ
  • ํ…Œํฌ ๋ธ”๋กœ๊ทธ
Powered by GitBook
On this page
Edit on GitHub
  1. Language
  2. Java

Stream

PreviousOptionalNextComparator, Comparator

Last updated 2 years ago

๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์—ฐ์‚ฐ์„ ์ง€์›ํ•˜๋„๋ก ์†Œ์Šค์—์„œ ์ถ”์ถœ๋œ ์—ฐ์†๋œ ์š”์†Œ

  • ์ŠคํŠธ๋ฆผ์€ ํŠน์ • ์š”์†Œ ํ˜•์‹์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ์—ฐ์†๋œ ๊ฐ’ ์ง‘ํ•ฉ์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•œ๋‹ค(filter, sorted, map ๊ฐ™์€ ํ‘œํ˜„ ๊ณ„์‚ฐ์‹) โ†” ์ปฌ๋ ‰์…˜์€ ๋ฐ์ดํ„ฐ์˜ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ œ๊ณตํ•จ

  • ์ŠคํŠธ๋ฆผ์€ ์ปฌ๋ ‰์…˜, ๋ฐฐ์—ด, I/O ์ž์› ๋“ฑ์˜ ๋ฐ์ดํ„ฐ ์ œ๊ณต ์†Œ์Šค๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์†Œ๋น„ํ•œ๋‹ค. ์ž…๋ ฅ ๊ทธ๋Œ€๋กœ ๊ฐ™์€ ์ถœ๋ ฅ์ˆœ์„œ๋ฅผ ์œ ์ง€ํ•œ๋‹ค

  • ์ŠคํŠธ๋ฆผ์€ fp์—์„œ ์ผ๋ฐ˜์ ์œผ๋กœ ์ง€์›ํ•˜๋Š” ์—ฐ์‚ฐ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ๋น„์Šทํ•˜๊ฒŒ filter, map, reduce, find, match, sort ๋“ฑ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅด๋ฅด ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๊ณ  ์ด๋ฅผ ์ˆœ์ฐจ์  ๋˜๋Š” ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค

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

  • ํŒŒ์ดํ”„๋ผ์ด๋‹ - ์ŠคํŠธ๋ฆผ ์—ฐ์‚ฐ๋ผ๋ฆฌ ์—ฐ๊ฒฐํ•ด์„œ ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ์ŠคํŠธ๋ฆผ ์ž๊ธฐ ์ž์‹ ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค - laziness, short-circuiting ์ตœ์ ํ™”๊ฐ€ ๊ฐ€๋Šฅํ•ด์ง

    • ๋ฐ์ดํ„ฐ ์†Œ์Šค๋ฅผ ๋ฐ›์•„์„œ ์ŠคํŠธ๋ฆผ์„ ๊ตฌ์„ฑํ•˜๊ณ , filter, map, limit,๋กœ ์ด์–ด์ง€๋Š” ์ผ๋ จ์˜ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์—ฐ์‚ฐ์„ ์ ์šฉํ•˜๊ณ , collect๋กœ ํŒŒ์ดํ”„๋ผ์ธ์„ ์ฒ˜๋ฆฌํ•ด์„œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. collect๊ฐ€ ํ˜ธ์ถœ๋˜๊ธฐ ์ „๊นŒ์ง€๋Š” ์•„๋ฌด ์—ฐ์‚ฐ๋„ ์ผ์–ด๋‚˜์ง€ ์•Š๋Š”๋‹ค.(๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์ด ์ €์žฅ๋จ. ์ง€์—ฐ์—ฐ์‚ฐ)

    • collect๋Š” ์ŠคํŠธ๋ฆผ์„ ๋‹ค๋ฅธ ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค(toList()๋กœ ๋ฆฌ์ŠคํŠธ ๋ณ€ํ™˜)

  • ๋‚ด๋ถ€ ๋ฐ˜๋ณต - ๋‚ด๋ถ€ ๋ฐ˜๋ณต์„ ์ง€์›ํ•จ โ†” ์ปฌ๋ ‰์…˜์€ ๋ฐ˜๋ณต์ž๋ฅผ ์ด์šฉํ•ด์„œ ๋ช…์‹œ์ ์œผ๋กœ ๋ฐ˜๋ณตํ•œ๋‹ค.

์ŠคํŠธ๋ฆผ๊ณผ ์ปฌ๋ ‰์…˜์˜ ์ฐจ์ด, ๋ฐฐ๊ฒฝ

  • ๊ณตํ†ต์  - ์ž๋ฐ” ์ปฌ๋ ‰์…˜, ์ŠคํŠธ๋ฆผ์€ ์—ฐ์†๋œ ์š”์†Œ ํ˜•์‹์˜ ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•œ๋‹ค

  • ์ฐจ์ด์ 

    1. ๋ฐ์ดํ„ฐ๋ฅผ ์–ธ์ œ ๊ณ„์‚ฐํ•˜๋Š” ์ง€์˜ ์—ฌ๋ถ€

      • ์ปฌ๋ ‰์…˜์€ ํ˜„์žฌ ์ž๋ฃŒ๊ตฌ์กฐ๊ฐ€ ํฌํ•จํ•˜๋Š” ๋ชจ๋“  ๊ฐ’์„ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค(์ ๊ทน์  ์ƒ์„ฑ - ๋ชจ๋“  ๊ฐ’์„ ๊ณ„์‚ฐํ•  ๋•Œ ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ๋‹ค. DVD์— ์ €์žฅ๋œ ์˜ํ™”)

      • ์ŠคํŠธ๋ฆผ์€ ์š”์ฒญํ•  ๋•Œ๋งŒ ์š”์†Œ๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๊ณ ์ •๋œ ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค(๊ฒŒ์œผ๋ฅธ ์ƒ์„ฑ - ํ•„์š”ํ•  ๋•Œ๋งŒ ๊ฐ’์„ ๊ณ„์‚ฐํ•œ๋‹ค. ์ŠคํŠธ๋ฆฌ๋ฐ ์„œ๋น„์Šค์—์„œ ์ˆœ์ฐจ์ ์œผ๋กœ ๋“ค์–ด์˜ค๋Š” ํŒจํ‚ท ์—ฐ์‚ฐ)

        • ์ŠคํŠธ๋ฆผ์˜ ์š”์†Œ๋Š” ์š”์ฒญํ•  ๋•Œ ๊ฒŒ์œผ๋ฅด๊ฒŒ ๊ณ„์‚ฐ๋œ๋‹ค

    2. ํ•œ๋ฒˆ ์†Œ๋น„๋œ ์ŠคํŠธ๋ฆผ์€ ๋‹ค์‹œ ํƒ์ƒ‰ํ•  ์ˆ˜ ์—†์Œ

      • ์ŠคํŠธ๋ฆผ์€ ํ•œ๋ฒˆ๋งŒ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•œ๋ฒˆ ํƒ์ƒ‰ํ•œ ์ŠคํŠธ๋ฆผ์„ ๋‹ค์‹œ ํƒ์ƒ‰ํ•˜๋ ค๋ฉด ์ƒˆ๋กœ์šด ์ŠคํŠธ๋ฆผ์„ ๋งŒ๋“ค์–ด์•ผํ•œ๋‹ค(๋‹จ ํ•œ๋ฒˆ๋งŒ ์†Œ๋น„ํ•  ์ˆ˜ ์žˆ๋‹ค)

        Stream<String> s = menu.stream();
        s.forEach(System.out::println);
        s.forEach(System.out::println); // java.lang.IllegalStateException์ด ๋ฐœ์ƒํ•จ. ์ŠคํŠธ๋ฆผ์ด ์ด๋ฏธ ์†Œ๋น„๋˜์—ˆ๊ฑฐ๋‚˜ ๋‹ซํž˜
      • ์ŠคํŠธ๋ฆผ ์žฌ์‚ฌ์šฉ ๋ถˆ๊ฐ€

        A stream should be operated on (invoking an intermediate or terminal stream operation) only once.

        A stream implementation may throw IllegalStateException if it detects that the stream is being reused.

        • ์žฌํ• ๋‹น์„ ํ•˜๊ฑฐ๋‚˜ ์ƒˆ๋กœ์šด ์ŠคํŠธ๋ฆผ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” Supplier๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

    3. ์™ธ๋ถ€ ๋ฐ˜๋ณต, ๋‚ด๋ถ€ ๋ฐ˜๋ณต

      • ์ปฌ๋ ‰์…˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ˆœํšŒํ•˜๋ ค๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ์š”์†Œ๋ฅผ ๋ฐ˜๋ณตํ•ด์•ผ ๋œ๋‹ค. (iterator๋‚˜ foreach๋ฌธ์œผ๋กœ ๋ช…์‹œ์ ์ธ ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ์ˆœํšŒํ•œ๋‹ค. ๋‚ด๋ถ€์ ์œผ๋กœ ์ˆจ๊ฒจ์ง„ iterator๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์™ธ๋ถ€ ๋ฐ˜๋ณต)

      • ์ŠคํŠธ๋ฆผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” filter, map, sorted ๋“ฑ์˜ ์—ฐ์‚ฐ์œผ๋กœ ๋ฐ˜๋ณต์„ ์ถ”์ƒํ™”ํ•ด์„œ ์•Œ์•„์„œ ์ฒ˜๋ฆฌํ•˜๊ณ , ๊ฒฐ๊ณผ ์ŠคํŠธ๋ฆผ๊ฐ’์„ ์ €์žฅํ•ด์ฃผ๋Š” ๋‚ด๋ถ€ ๋ฐ˜๋ณต์„ ์‚ฌ์šฉํ•œ๋‹ค(iterator๊ฐ€ ํ•„์š”์—†์Œ)

        List<String> names = new ArrayList<>();
        for(Dish dish: menu) {
        	names.add(dish.getName());
        }
        List<String> names = menu.stream()
        	.map(Dish::getName)
        	.collect(toList());
      • ์ŠคํŠธ๋ฆผ์˜ ๋‚ด๋ถ€๋ฐ˜๋ณต์ด ์ปฌ๋ ‰์…˜์˜ ์™ธ๋ถ€๋ฐ˜๋ณต๋ณด๋‹ค ๋” ์ข‹์€ 2๊ฐ€์ง€ ์ด์œ 

        1. filter๋‚˜ map ๋“ฑ์˜ ์ค‘๊ฐ„์—ฐ์‚ฐ์ด ์ œ๊ณตํ•˜๋Š” ๋‚ด๋ถ€๋ฐ˜๋ณต์„ ์ด์šฉํ•˜๋ฉด ์ž‘์—…์„ ํˆฌ๋ช…ํ•˜๊ฒŒ ๋ณ‘๋ ฌ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ณ , ๋” ์ตœ์ ํ™”๋œ ๋‹ค์–‘ํ•œ ์ˆœ์„œ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

        2. ์ŠคํŠธ๋ฆผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋‚ด๋ถ€ ๋ฐ˜๋ณต์€ ๋ฐ์ดํ„ฐ ํ‘œํ˜„๊ณผ ๋ณ‘๋ ฌ์„ฑ ๊ตฌํ˜„์„ ์ž๋™์œผ๋กœ ์„ ํƒํ•˜์ง€๋งŒ ์™ธ๋ถ€๋ฐ˜๋ณต์˜ ๊ฒฝ์šฐ ๋ณ‘๋ ฌ์„ฑ์„ synchronized ๋“ฑ์œผ๋กœ ์Šค์Šค๋กœ ๊ด€๋ฆฌํ•ด์•ผํ•œ๋‹ค(์ŠคํŠธ๋ฆผ API ๋‚ด๋ถ€์ ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰ํ• ์ง€ ๋ง์ง€๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค)

https://stackoverflow.com/questions/36255007/is-there-any-way-to-reuse-a-stream
https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html