어떤 객체의 이름을 반복하지 않고 그 객체에 대해 다양한 연산을 수행할 수 있게 해줌
fun alphabet(): String {
val result = StringBuilder()
for (letter in 'A'..'Z')
result.append(letter)
result.append("\n Now I know the alphabet!")
return result.toString()
}
fun main(){
println(alphabet())
// ABCDEFGHIJKLMNOPQRSTUVWXYZ
// Now I know the alphabet!
}
fun alphabet(): String {
val stringBuilder = StringBuilder()
return with(stringBuilder) { // 메서드를 호출하려는 수신 객체를 지정
for (letter in 'A'..'Z')
this.append(letter)
this.append("\n Now I know the alphabet!")
this.toString() // with의 결과 반환
}
}
fun alphabet() = with(StringBuilder()) {
for (letter in 'A'..'Z')
append(letter)
append("\n Now I know the alphabet!")
toString()
}
with에 인자로 넘긴 객체의 클래스와 with를 사용하는 함수가 선언된 클래스 안에 이름이 같은 메서드가 있는 경우
with가 반환하는 값 → 람다를 실행한 결과
apply 함수는 with와 동일하게 작동하지만 apply는 항상 자신에게 전달된 객체를 반환한다는 차이가 있음
fun alphabet() = StringBuilder().apply {
for (letter in 'A'..'Z')
append(letter)
append("\n Now I know the alphabet!")
}.toString()
인스턴스를 만들면서 즉시 프로퍼티 중 일부를 초기화해야 하는 경우 apply가 유용함
fun createViewWithCustomAttribute(context: Context) =
TextView(context).apply {
text = "Sample Text"
textSize = 20.0
setPadding(10, 0, 0, 0)
}
fun alphabet() = buildString {
for (letter in 'A'..'Z')
append(letter)
append("\n Now I know the alphabet!")
}
읽기 전용 컬렉션을 가변 컬렉션 처럼 생성하기
val fibonacci = buildList {
addAll(listOf(1,1,2))
add(3)
add(index = 0, element = 3)
}
val shouldAdd = true
val fruits = buildSet {
add("Apple")
if(shouldAdd) {
addAll(listOf("Apple", "Banana", "Cherry"))
}
}
val medals = buildMap<String, Int> {
put("Gold", 1)
putAll(listOf("silver" to 2, "Bronze" to 3))
}
수신 객체를 받고 그 수신 객체에 대해 어떤 동작을 수행한 후 수신 객체를 돌려줌
fun main() {
val fruits = listOf("Apple", "Banana", "Cherry")
val uppercaseFruits = mutableListOf<String>()
val reversedLongFruits = fruits
.map{ it.uppercase() }
.also{ uppercaseFruits.addAll(it) }
.filter { it.length > 5 }
.also { println(it) }
.reversed()
// [BANANA, CHERRY]
println(uppercaseFruits)
// [APPLE, BANANA, CHERRY]
println(reversedLongFruits)
// [CHERRY, BANANA]
}