Array 클래스에는 public 생성자가 하나만 있다. 이 생성자는 다음의 두 인자를 받는다.
Int 타입의 size , init 즉 (Int) -> T 타입의 람다
Array 클래스 생성자의 두 번째 인자인 람다는 배열을 생성 할 때 인덱스마다 호출된다.
처음 5개의 정수를 제곱한 값의 문자열 배열을 생성하는 코드
val squares = Array(5){i->(i*i).toString()}
indice - 배열의 인덱스 값을 알려줌
val strings = arrayOf("hi","it's","sunday") val indices = strings.indices //asserThat(indices, contains(0,1,2)
withIndex - for문을 돌 때 인덱스도 같이 활용하고 싶음
val strings = arrayOf("hi","it's","sunday") for((index,value) in strings.withIndex){ println("Index $index Value $value")} //Index 0 Value hi //Index 1 Value it's //Index 2 Value sunday
listOf, setOf, mapOf
associateWith - 키 리스트가 있을 때 각각의 키와 생성한 값을 연관시켜서 맵을 만들 수 있음
val keys = 'a'...'f' val map = keys.associateWith{(it.toString().repeat(5).capitalize()} println(map) //{a=Aaaaa,b=Bbbbb,c=Ccccc,d=Ddddd,e=Eeeee}
filter
data class Product (val name : String, var price : Double, var onSlae : Boolean = false)
//판매중인 상품의 이름 얻기 fun nameOfProductOnSale(products:List<Product>= products.filter{it.onSale} .map{it.name} .joinToString(separator=", ")
//판매중인 상품이 없을 때 (it.onSale이 모두 false 일 때) //위의 예제는 빈 문자열을 반환함 //ifEmpty를 사용하면 특정 문자열을 리턴 fun onSaleProducts_ifEmptyCollection(products:List<Product>)= products.filter{it.onSale} .map{it.name} .ifEmpty{listOf("none")} .joinToString(separator = ", ")
onSaleProducts_ifEmptyString(products:List<Product>)= products.filter{it.onSale} .map{it.name} .joinToString(separator = ", ") .ifEmpty{"none"}
coerceIn - 값이 범위 안에 있으면 해당 값을, 값이 범위 안에 없으면 경계값을 리턴
val range = 3..8 5.coerceIn(range) //5 1.coerceIn(range) // 3 9.coerceIn(range) //8 5.coreceIn(3,6) //5
chunked
val range=0..10 range.chunked(3) //return List<List<Int>> //[[0,1,2],[3,4,5],[6,7,8],[9,10]] range.chunked(3){it.sum()} //listOf(3,12,21,19) ranve.chunked(3){it.average()} //listOf(1.0,4.0,7.0,9,5)
windowed
- windowed(size, size, partialWindows = false)
-size : 각 윈도우에 포함될 원소의 개수
-size : 각 단계마다 전진할 원소의 개수 (기본 1개)
-partialWindows : 나뉘어 있는 마지막 부분이 윈도우에 필요한 만큼의 원소 개수를 갖지 못한 경우, 해당 부분을 그대로 유지할지 여부를 알려주는 불리언 값 (기본 flase)- chunked 함수는 windowed(chunked인자, chunked인자, true) 인 특별한 case의 windowed 함수다.
val range = 0..10 range.windowed(3,3) //[[0,1,2],[3,4,5],[6,7,8]] //한 리스트에 3개씩, 3만큼 전진 //마지막 윈도우는 3개가 아님. partialWindows 기본값 false 이기 때문에 출력되지 않음 range.windowed(3,3){it.average()} //[1.0,4.0,7.0] range.windowed(3,1) //[[0,1,2],[1,2,3],[2,3,4],[3,4,5],[4,5,6],[6,7,8],[7,8,9],[8,9,10]] //한 윈도우에 3개씩, 1만큼 전진 //[9,10],[10] 은 3개가 들어있지 않고 partialWindows 기본값 false 이기 때문에 출력되지 않음 range.windowed(3,1){it.average()} //[1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0]
componentN - 생성된 리스트의 처음 다섯 원소가 자신과 같은 값과 같은 이름의 변수에 할당된다. 리스트의 처음 5개 원소만 적용된다.
val list = listOf("a","b","c","d","e","f","g") val (a,b,c,d,e) = list println("$a,$b,$c,$d,$e") //"a b c d e"
sortedWith, comparedBy
data class Golfer(val score : Int, val first : String, val last : String) val golfers = listOf( Golfer(70,"eunji", "park"), Golfer(70,"eunji", "kim"), Golfer(78,"jihong", "han"), Golfer(78,"hanmo", "kim"))
//점수로 정렬 - 점수가 같으면 성으로 정렬 - 성이 같으면 이름으로 정렬 //오름차순으로 정렬됨 golfers.soredWith( comparedBy({it.socre},{it.last},{it.first}) )
//comparator과 thenBy 함수를 사용해 정렬하기 val comparator = compareBy<Golfer>(Golfer::score) .thenBy(Golfer::last) .thenBy(Golfer::first) golfers.sortedWith(comparator)
filterIsInstance, filterIsInstanceTo
val list = listOf("a",LocalDate.now(),3,1,4,"b") val strings = list.fiter{it is String} for (s in strings){ //s.length //컴파일되지 않음 } //필터링 연산은 작동하지만, strings의 타입이 List<Any> 이기 때문에 s.length가 작동하지 않는다
//filterIsInstance 사용 val list = listOf("a",LocalDate.now(),3,1,4,"b") val all = list.filterIsInstance<Any>() //list val strings = list.filterIsInstance<String>() //"a","b" val ints = list.filterIsInstance<Int>() //1,3,4 val dates = list.filterIsInstance<LocalDate::Class.java>() //Localdate.now()