본문 바로가기
Kotlin

Collection에 대하여 -2 collection에 적용할수 있는 함수들

by 봄석 2019. 3. 9.

Collection에 대하여 -2


출처 - https://mdwgti16.github.io/kotlin/kotlin-collection-api2/#


  • all

    @Test
    fun all() {
      val fruitList = listOf("strawberry", "grape", "pineapple", "banana", "apple")
      assertEquals(true, fruitList.all { it.length >= 5 })
      assertEquals(false, fruitList.all { it.contains("apple") })
    }
    

    (AND) 주어진 조건을 모든 원소들이 만족하면 true 아니면 false

  • any

    @Test
    fun any() {
      val fruitList = listOf("strawberry", "grape", "pineapple", "banana", "apple")
      assertEquals(true, fruitList.any { it.length >= 10 })
      assertEquals(true, fruitList.any { it.contains("apple") })
    }
    

    (OR) 주어진 조건을 원소들이 하나라도 만족하면 true 아니면 false

  • none

    @Test
    fun none() {
      val fruitList = listOf("strawberry", "grape", "pineapple", "banana", "apple")
      assertEquals(true, fruitList.none { it.length < 5 })
      assertEquals(true, fruitList.none { it.contains("watermelon") })
    }
    

    주어진 조건을 만족하는 원소가 없으면 true

  • find

    @Test
    fun find() {
      val fruitList = listOf("strawberry", "grape", "pineapple", "banana", "apple")
      assertEquals("pineapple", fruitList.find { it.contains("apple") })
      assertEquals("apple", fruitList.findLast { it.contains("apple") })
    }
    

    주어진 조건을 만족하는 첫번째 원소 return

  • count

    @Test
    fun count() {
      val fruitList = listOf("strawberry", "grape", "pineapple", "banana", "apple")
      assertEquals(2, fruitList.count { it.contains("apple") })
    }
    

    주어진 조건을 만족하는 원소의 개수 return

  • map

    @Test
    fun map() {
      val numberList = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
      assertEquals(110, numberList.map { it * 2 }.sum())
    }
    

    각 원소를 주어진 조건으로 변경

  • flatMap

    @Test
    fun flatMap() {
      val numberList = listOf(2, 5, 11)
      assertEquals(listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10),
          numberList.flatMap { (it / 2 until it) })
    }
    

    각 원소를 주어진 조건의 List로 변경

  • filter

    @Test
    fun filter() {
      val fruitList = listOf("strawberry", "grape", "pineapple", "banana", "apple")
      assertEquals(listOf("pineapple", "apple"),
          fruitList.filter { it.contains("apple") })
    }
    

    주어진 조건을 만족하는 원소만 통과

  • asSequence

    val numberList = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
      numberList.filter{ println("first no asSequence $it");it%2==0}
          .map { println("second no asSequence $it"); it*2  }.toList()
      numberList.asSequence().filter{ println("first no result $it");it%2==0}
          .map { println("second no result $it"); it*2 } // 출력 안됨
      numberList.asSequence().filter{ println("first asSequence $it");it%2==0}
          .map { println("second asSequence $it"); it*2  }.toList()
    
      //sequence 생성
      val numbers = generateSequence(0) { it + 1 }
      val numbersTo10 = numbers.takeWhile { print(it);it <= 10 }
      println("before sum")
      println(numbersTo10.sum())}
    

    filter와 map는 기본적으로 수행 될때마다 list에 추가되고 그 list가 반환된다.

    first no asSequence 1
    first no asSequence 2
    first no asSequence 3
    first no asSequence 4
    first no asSequence 5
    second no asSequence 2
    second no asSequence 4
    

    filter를 끝나고 그 list를 map이 받아 다시 수행하고 list가 반환 된다.

    하지만 sequence일 경우

    first asSequence 1
    first asSequence 2
    second asSequence 2
    first asSequence 3
    first asSequence 4
    second asSequence 4
    first asSequence 5
    

    이렇게 된다.

    sequence를 사용할때는 마지막에 toList() 나 sum()같은 최종 연산을 해줘야된다.

    before sum
    0123456789101155
    

    아래의 생성된 sequence를 실행해보면 sum을 하기전에는 출력이 안되는 것을 볼 수 있다.


댓글