개발일지
[Android][Kotlin] Scope Function, Collections 본문
- 람다식을 이용해서 호출하면 일시적인 범위 생김 → 그 범위 안에서 전달된 객체에 대해 it 또는 this 라는 Context Object 통해 접근
- Context Object 를 참조하는 방법 (this, it)
- Return value
1) Context Object : this , it
→ Scope Function 람다식 내에서 Context Object 는 실제 객체명 대신 it, this 로 접근
***this***
-run, with, apply 는 Context Object 를 this 로 참조
→ 따라서 람다식 안에는 일반 클래스 멤버처럼 사용할 수 있음 (this 는 생략할 수 있지만 동일한 이름의 멤버가 있는 경우 구별할 수 없으니 가급적 Context Object에 대해서는 this 를 붙여서 사용하는 것 좋음)
***it***
-let, also 는 it 으로 참조
→ 따로 전달 인자명을 지정할 수 있고 지정하지 않으면 기본적으로는 it 으로 접근함
2) Return Value
- apply, also 는 Context Object 반환
→ apply, also 의 반환 값은 Context Object 객체 자체임
→ 그래서 체인 형식으로 계속적인 호출이 가능하고 Context Object 를 반환하는 함수의 return 문에도 사용할 수 있음
ex) .also { ... } .apply {...} .also {.....}
return Random.mm.also {..}
- let, run, with 는 람다식 결과 반환
→ 람다식을 반환하기 때문에 결과를 변수에 저장하거나 결과에 대해 추가적인 작업 등을 수행할 때 사용할 수 있음 / 반환 값을 무시하고 바로 람다식을 사용하여 임시범위를 만들어 사용할 수 있음
#### let - 객체 결과 값에 하나 이상의 함수를 호출하는 경우 사용 ####
Context Object : it
Return value: 람다
======================Collections===========================
#####filter & map #######
filter 함수는 컬렉션을 이터레이션 하면서 각 원소를 넘겨서 true 반환하는 원소만 모은다.
/ 컬렉션에서 원치 않은 원소를 제거 함 / 하지만 filter 함수는 원소를 변환할 수 없다. 원소를 변환하려면 map 함수를 사용해야 함
map 함수는 주어진 람다를 컬렉션의 각 원소에 적용한 결과를 모아서 새 컬렉션을 만든다.
→ 집합객체의 데이터 수만큼 반복하여 실행하고 결과 값을 반환
map : key, value 쌍을 저장 / 키는 고유하지만 다른 키는 동일한 값으로 쌍을 이룰 수 있음 ,
===========for vs. foreach===========
for 를 사용하는 방법
val numbers = listOf("one", "two", "three", "four") for (item in numbers) { println(item) }
forEach() 를 사용하는 방법
val numbers = listOf("one", "two", "three", "four") numbers.forEach { println(it)
==================================in/ out =====================
Kotlin의 in/out
kotlin에서는 명시적으로 super/extends 대신 in/out 키워드를 제공하는데, 각각의 정의와 매칭은 아래와 같습니다.
- T : 별도의 Wildcard 정의가 없이 read/write 모두 가능
- in T : Java의 ? super T와 같음. input의 약자이며 write 만 가능
- out T : Java의 ? extends T와 같음. output의 약자이며 read 만 가능
-------------------------------------
Kotlin - out : ? extends T (java)
out은 java의 ? extends T와 매칭 되며, read only를 만들게 됩니다.
private fun printAll(items: ArrayList<out Output<String>>) { // Error... // items.add(object : Output<String> { // override fun isArgument(argument: String) = false // }) items.indices .filter { items[it].isArgument("") } .forEach { println("item : " + items[it]) } // items.add(null) - Error }
Kotlin - in : ? super T (java)
private fun addItem(items: ArrayList<in Output<String>>) { items.add(object : Output<String> { override fun isArgument(argument: String) = false }) // items.indices // .filter { items[it].isArgument("") } // .forEach { println("item : " + items[it]) } // items.add(null) }
'Android' 카테고리의 다른 글
[Android] ConditionVariable (0) | 2021.06.29 |
---|---|
[Android] gradle (0) | 2021.06.29 |
[Android] Observer Pattern / Event Bus (0) | 2021.06.29 |
[Android][Kotlin] return and jumps and This-expressions (0) | 2021.06.29 |
[Android] Scoped Storage (0) | 2021.06.29 |