본문 바로가기
Kotlin

[Kotlin] Stream 함수 #1.Map이라는 단어가 들어가는 함수

by Bhinney 2023. 12. 4.

❓코틀린에서 스트림 함수란?

  • JAVA와 달리 Kotlin에서는 stream 대신 유사한 함수를 표준 라이브러리로 제공
  • JAVA는 stream 메서드를 호출해야함

1️⃣ map()

  • 컬렉션 내의 자료들을 다른 값 또는 다른 타입으로 변환 시 사용

2️⃣ mapNotNull()

  • 컬렉션 내의 자료들을 다른 값 또는 다른 타입으로 변환하고 변환 값이 null 값이면 무시
fun mapExample() {
   val days = listOf("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday")

   // map()
   println("< map() 함수를 사용 했을 때 >")
   days.map { day -> "오늘은 $day" }.forEach { println(it) }
   
   println()
   
   println("< map() 함수를 사용하고 null 값이 있을 때 >")
   days.map { day -> if (day.length > 6) day else null }.forEach { println(it) }

   println()

   // mapNotNull()
   println("< mapNotNull() 함수를 사용 했을 때 >")
   days.mapNotNull { day -> if (day.length > 6) day else null }.forEach { println(it) }
}

/*
< map() 함수를 사용 했을 때 >
오늘은 Monday
오늘은 Tuesday
오늘은 Wednesday
오늘은 Thursday
오늘은 Friday
오늘은 Saturday
오늘은 Sunday

< map() 함수를 사용하고 null 값이 있을 때 >
null
Tuesday
Wednesday
Thursday
null
Saturday
null

< mapNotNull() 함수를 사용 했을 때 >
Tuesday
Wednesday
Thursday
Saturday
*/

3️⃣ mapIndexed() 

  • 컬렉션 내의 자료들과 그 자료의 인덱스를 이용하여 변환
fun mapIdxExample() {
   val days = listOf("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday")
   
   days.mapIndexed { index, s -> "$index 번째 요일 : $s"}.forEach{ println(it) }
}

/*
0 번째 요일 : Monday
1 번째 요일 : Tuesday
2 번째 요일 : Wednesday
3 번째 요일 : Thursday
4 번째 요일 : Friday
5 번째 요일 : Saturday
6 번째 요일 : Sunday
*/

4️⃣ flatMap()

  •  map()함수와 비슷하지만 다른 부분이 변환 함수의 반환 형이 iterable
  • 컬렉션 내의 하나의 자료를 여러 개의 인자로 변환
fun flatMapExample() {
   val days = listOf("Saturday", "Sunday")

   days.flatMap { "$it".toList() }.forEach { print("#$it ") }
}

/*
#S #a #t #u #r #d #a #y #S #u #n #d #a #y 
*/

➕JAVA에서 비슷하게 구현해보기

더보기
import java.util.Arrays;
import java.util.Objects;
import java.util.stream.IntStream;

private static void mapExample() {
   String[] days = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"};

   System.out.println("< map() 함수를 사용 했을 때 >");
   Arrays.stream(days).map(day -> "오늘은 " + day).forEach(System.out::println);

   System.out.println();

   System.out.println("< null 값이 있을 때 >");
   Arrays.stream(days).map(day -> {
      if (day.length() > 6) return day;
      else return null;
   }).forEach(System.out::println);

   System.out.println();

   System.out.println("< null 값이 없을 때 >");
   Arrays.stream(days).map(day -> {
      if (day.length() > 6) return day;
      else return null;
   }).filter(Objects::nonNull).forEach(System.out::println);

   System.out.println();

   System.out.println("< Index를 사용 했을 때>");
   IntStream.range(0, days.length).mapToObj(idx -> idx + "번째 요일 : " + days[idx]).forEach(System.out::println);

   System.out.println();

   System.out.println("< flatMap()을 사용 했을 때>");
   Arrays.stream(days).flatMap( day -> Arrays.stream(day.split(""))).forEach(s -> System.out.print("#" + s + " "));

/*
< map() 함수를 사용 했을 때 >
오늘은 Monday
오늘은 Tuesday
오늘은 Wednesday
오늘은 Thursday
오늘은 Friday
오늘은 Saturday
오늘은 Sunday

< null 값이 있을 때 >
null
Tuesday
Wednesday
Thursday
null
Saturday
null

< null 값이 없을 때 >
Tuesday
Wednesday
Thursday
Saturday

< Index를 사용 했을 때>
0번째 요일 : Monday
1번째 요일 : Tuesday
2번째 요일 : Wednesday
3번째 요일 : Thursday
4번째 요일 : Friday
5번째 요일 : Saturday
6번째 요일 : Sunday

< flatMap()을 사용 했을 때>
#M #o #n #d #a #y #T #u #e #s #d #a #y #W #e #d #n #e #s #d #a #y #T #h #u #r #s #d #a #y #F #r #i #d #a #y #S #a #t #u #r #d #a #y #S #u #n #d #a #y
*/

댓글