개발일지

[Android][Kotlin] Scope Function, Collections 본문

Android

[Android][Kotlin] Scope Function, Collections

강강강 2021. 6. 29. 19:18
  •  람다식을 이용해서 호출하면 일시적인 범위 생김 → 그 범위 안에서 전달된 객체에 대해 it 또는 this 라는 Context Object 통해 접근 
  1. Context Object 를 참조하는 방법 (this, it)
  2. 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   쌍을 저장 / 키는 고유하지만 다른 키는 동일한 값으로 쌍을 이룰 수 있음 ,   

27살 초과하는 사람들의 이름으로 새로운 컬렉션을 만드는 것

===========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