λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
μΉ΄ν…Œκ³ λ¦¬ μ—†μŒ

[JAVA] λžŒλ‹€μ‹κ³Ό Stream API(filter, map, limit, sorted, peek λ“±)

by nitronium102 2021. 7. 1.
κ³΅λΆ€ν•˜λ‹€κ°€ λžŒλ‹€μ‹μ΄λž‘ 슀트림 λ‚˜μ™€μ„œ 정리할겸 적어본닀

λžŒλ‹€μ‹μ΄λž€?

JAVA 8λΆ€ν„° μΆ”κ°€λœ ν‘œν˜„ 방식 쀑 ν•˜λ‚˜λ‘œ ν•¨μˆ˜ν˜• ν‘œν˜„λ°©μ‹μ΄λ‹€. λ©”μ†Œλ“œλ₯Ό ν•˜λ‚˜μ˜ κ°„κ²°ν•œ μ‹μœΌλ‘œ ν‘œν˜„ν•œ 것이닀.

λ©”μ†Œλ“œλ₯Ό λžŒλ‹€μ‹μœΌλ‘œ ν‘œν˜„ν•˜λ©΄ λ©”μ†Œλ“œμ˜ 이름과 λ°˜ν™˜κ°’μ΄ μ—†μ–΄μ§€λ―€λ‘œ '읡λͺ… ν•¨μˆ˜'라고도 ν•œλ‹€. 

 

κΈ°μ‘΄ μžλ°” 문법

new Thread(new Runnable() {
   @Override
   public void run() { 
      System.out.println("This is not lambda"); 
   }
})

λžŒλ‹€μ‹ 문법

new Thread(()->{
      System.out.println("This is lambda");
}

μ΄λŸ¬ν•œ λžŒλ‹€ ν‘œν˜„μ‹μ€ λ©”μ†Œλ“œμ˜ λ§€κ°œλ³€μˆ˜λ‘œ 전달될 μˆ˜λ„ 있으며, λ©”μ†Œλ“œμ˜ κ²°κ΄κ°’μœΌλ‘œ λ°˜ν™˜λ  μˆ˜λ„ μžˆλ‹€. 

λ”°λΌμ„œ ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μΈ λžŒλ‹€ ν‘œν˜„μ‹μ„ μ‚¬μš©ν•˜λ©΄ μ½”λ“œκ°€ 간결해지고 가독성이 쒋아진닀. 

 

 

λžŒλ‹€ ν‘œν˜„μ‹ μž‘μ„±

μžλ°”μ—μ„œλŠ” ν™”μ‚΄ν‘œ(->) 기호λ₯Ό μ‚¬μš©ν•˜μ—¬ λžŒλ‹€ ν‘œν˜„μ‹μ„ μž‘μ„±ν•œλ‹€. 

(λ§€κ°œλ³€μˆ˜ λͺ©λ‘) -> { ν•¨μˆ˜ λͺΈμ²΄ }

 

ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€(functional interface)

λžŒλ‹€ ν‘œν˜„μ‹μ„ μ‚¬μš©ν•  λ•ŒλŠ” λžŒλ‹€ ν‘œν˜„μ‹μ„ μ €μž₯ν•˜κΈ° μœ„ν•œ μ°Έμ‘° λ³€μˆ˜μ˜ νƒ€μž…μ„ κ²°μ •ν•΄μ•Όλ§Œ ν•œλ‹€.

μ°Έμ‘°λ³€μˆ˜νƒ€μž… μ°Έμ‘°λ³€μˆ˜μ΄λ¦„ = λžŒλ‹€ ν‘œν˜„μ‹

μœ„μ˜ λ¬Έλ²•μ²˜λŸΌ λžŒλ‹€ ν‘œν˜„μ‹μ„ ν•˜λ‚˜μ˜ λ³€μˆ˜μ— λŒ€μž…ν•  λ•Œ μ‚¬μš©ν•˜λŠ” μ°Έμ‘° λ³€μˆ˜μ˜ νƒ€μž…μ„ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λΌκ³  ν•œλ‹€.

 

ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λŠ” 좔상 ν΄λž˜μŠ€μ™€λŠ” 달리 단 ν•˜λ‚˜μ˜ 좔상 λ©”μ†Œλ“œλ§Œμ„ κ°€μ Έμ•Ό ν•œλ‹€.

λ˜ν•œ @FunctionalInterface μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•˜μ—¬ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€μž„μ„ λͺ…μ‹œν•  수 μžˆλ‹€. (μ»΄νŒŒμΌλŸ¬κ°€ ν•΄λ‹Ή μΈν„°νŽ˜μ΄μŠ€λ₯Ό ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ‘œ 인식)

μžλ°” μ»΄νŒŒμΌλŸ¬λŠ” μ΄λ ‡κ²Œ λͺ…μ‹œλœ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€μ— 두 개 μ΄μƒμ˜ λ©”μ†Œλ“œκ°€ μ„ μ–Έλ˜λ©΄ 였λ₯˜λ₯Ό λ°œμƒμ‹œν‚¨λ‹€.


Stream API

JAVA의 Stream은 μ»¬λ ‰μ…˜(collection)의 μš”μ†Œλ₯Ό ν•˜λ‚˜μ”© μ°Έμ‘°ν•˜μ—¬ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€(λžŒλ‹€μ‹)으둜 μ²˜λ¦¬ν•  수 μžˆλ„λ‘ ν•΄μ£ΌλŠ” μΌμ’…μ˜ λ°˜λ³΅μžμ΄λ‹€. 

μžλ°”μ—μ„œ μ“°μ΄λŠ” μž…μΆœλ ₯ μŠ€νŠΈλ¦Όκ³ΌλŠ” κ΄€λ ¨ μ—†λ‹€
(inputStream은 java.io νŒ¨ν‚€μ§€ / Stream은 java.util νŒ¨ν‚€μ§€)

 

슀트림 API의 λ™μž‘ 흐름

01. 슀트림 생성

02. μ€‘κ°œ μ—°μ‚°(슀트림의 λ³€ν™˜)

03. μ΅œμ’… μ—°μ‚°(슀트림의 μ‚¬μš©)

좜처 : http://tcpschool.com/java/java_stream_creation

 

이 ν¬μŠ€νŠΈμ—μ„œλŠ” 주둜 μ‚¬μš©ν•˜λŠ” 것은 μ€‘κ°œ 연산에 λŒ€ν•΄μ„œλ§Œ μ†Œκ°œν•˜κ² λ‹€

슀트림의 μ€‘κ°œ μ—°μ‚°(intermediate operation)

슀트림 API에 μ˜ν•΄ μƒμ„±λœ 초기 μŠ€νŠΈλ¦Όμ€ μ€‘κ°œ 연산을 톡해 또 λ‹€λ₯Έ 슀트림으둜 λ³€ν™˜λœλ‹€(연속 μ‚¬μš© κ°€λŠ₯)

슀트림의 μ€‘κ°œ 연산은 filter-map 기반의 APIλ₯Ό μ‚¬μš©ν•œλ‹€.

 

λŒ€ν‘œμ μΈ μ€‘κ°œ μ—°μ‚°κ³Ό λ©”μ†Œλ“œ

1. 슀트림 필터링 : filter(), distinct()

- filter :  ν•΄λ‹Ή μŠ€νŠΈλ¦Όμ—μ„œ 주어진 쑰건에 λ§žλŠ” μš”μ†Œλ§ŒμœΌλ‘œ κ΅¬μ„±λœ μƒˆλ‘œμš΄ μŠ€νŠΈλ¦Όμ„ λ°˜ν™˜

IntStream stream = IntStream.of(7, 5, 5, 2, 1, 2, 3, 5, 4, 6);
// μŠ€νŠΈλ¦Όμ—μ„œ ν™€μˆ˜λ§Œμ„ 골라냄
stream.filter(n -> n % 2 != 0).forEach(e -> System.out.print(e + " "));

 

- distinct : ν•΄λ‹Ή μŠ€νŠΈλ¦Όμ—μ„œ μ€‘λ³΅λœ μš”μ†Œκ°€ 제거된 μƒˆλ‘œμš΄ μŠ€νŠΈλ¦Όμ„ λ°˜ν™˜. (λ‚΄λΆ€μ μœΌλ‘œ Object 클래슀의 equals() λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μš”μ†Œμ˜ 쀑볡을 λΉ„κ΅ν•œλ‹€)

// μŠ€νŠΈλ¦Όμ—μ„œ μ€‘λ³΅λœ μš”μ†Œλ₯Ό μ œκ±°ν•¨.
stream.distinct().forEach(e -> System.out.print(e + " "));

 

2. 슀트림 λ³€ν™˜ : map(), flatMap()

- map : ν•΄λ‹Ή 슀트림의 μš”μ†Œλ“€μ„ 주어진 ν•¨μˆ˜μ— 인수둜 μ „λ‹¬ν•˜μ—¬, κ·Έ λ°˜ν™˜κ°’λ“€λ‘œ 이루어진 μƒˆλ‘œμš΄ μŠ€νŠΈλ¦Όμ„ λ°˜ν™˜

- flatMap(슀트림 μš”μ†Œκ°€ 배열일 λ•Œ) : 각 λ°°μ—΄μ˜ 각 μš”μ†Œμ˜ λ°˜ν™˜κ°’μ„ ν•˜λ‚˜λ‘œ ν•©μΉœ μƒˆλ‘œμš΄ μŠ€νŠΈλ¦Όμ„ λ°˜ν™˜

 

3. 슀트림 μ œν•œ : limit(), skip()

- limit : ν•΄λ‹Ή 슀트림의 첫 번째 μš”μ†ŒλΆ€ν„° μ „λ‹¬λœ 개수만큼의 μš”μ†Œλ§ŒμœΌλ‘œ 이루어진 μƒˆλ‘œμš΄ μŠ€νŠΈλ¦Όμ„ λ°˜ν™˜

- skip : ν•΄λ‹Ή 슀트림의 첫 번째 μš”μ†ŒλΆ€ν„° μ „λ‹¬λœ 개수만큼의 μš”μ†Œλ₯Ό μ œμ™Έν•œ λ‚˜λ¨Έμ§€ μš”μ†Œλ§ŒμœΌλ‘œ μ΄λ£¨μ–΄μ§„ μƒˆλ‘œμš΄ μŠ€νŠΈλ¦Όμ„ λ°˜ν™˜

 

4. 슀트림 μ •λ ¬ : sorted()

- sorted : ν•΄λ‹Ή μŠ€νŠΈλ¦Όμ„ 주어진 λΉ„κ΅μž(comparator)λ₯Ό μ΄μš©ν•˜μ—¬ μ •λ ¬.(default : μ•ŒνŒŒλ²³ 순)

 

5. 슀트림 μ—°μ‚° κ²°κ³Ό 확인 : peek()

- peak : κ²°κ³Ό μŠ€νŠΈλ¦ΌμœΌλ‘œλΆ€ν„° μš”μ†Œλ₯Ό μ†Œλͺ¨ν•˜μ—¬ μΆ”κ°€λ‘œ λͺ…μ‹œλœ λ™μž‘μ„ μˆ˜ν–‰. 주둜 λ””λ²„κΉ…μš©

λŒ“κΈ€