안드로이드 개발 팁 #30 - Collection, MutableCollection 연산 확장 함수 filter, count, indexOfFirst, sortWith, sortedWith
시작하며...
kotlin.collections 패키지에서는 배열, 리스트 등 Collection, MutableCollection 인터페이스를 구현하는 콜렉션 클래스 관련 여러 가지 확장 함수들이 있습니다. 그 중에서 실무에 자주 사용되는 몇가지를 정리해보고자 합니다. 이들을 알아두면, 자바보다 깔끔한 코드를 만들 수 있어 좋습니다.
filter 확장 함수
이 함수는 특정 조건을 만족하는 원소들만 모아서 새로운 리스트로 리턴합니다.
val list = listOf(1, 3, 2, 5, 4)
val filteredList = list.filter { e -> (e > 3) }
count 확장 함수
이 함수는 특정 조건을 만족하는 원소들의 개수를 리턴합니다.
val list = listOf(1, 3, 2, 5, 4)
val filteredListSize = list.count { e -> (e > 3) }
indexOfFirst 확장 함수
이 함수는 특정 조건을 만족하는 최초 원소의 인덱스를 리턴합니다.
val list = listOf(1, 3, 2, 5, 4)
val indexOf3 = list.indexOfFirst { e -> (e == 3) }
sortWith 확장 함수
특정 필드 기준으로 오름차순 정렬을 실행합니다. 이 함수를 실행한 mutable list가 정렬됩니다.
val list = listOf(…)
list.sortWith(compareBy({ it.필드A }, { it.필드B }, { it.필드C }))
sortedWidth 확장 함수
특정 필드 기준으로 오름차순 정렬을 한 리스트를 리턴합니다. Immutable list만 실행 가능합니다.
val list = listOf(…)
val newList = list.sortedWith(compareBy({ it.필드A }, { it.필드B }, { it.필드C }))
예제 코드
data class Lecture(
val lecID: String,
val categoryID: String,
val name: String,
val isBookmarked: Boolean
)
var lecList = mutableListOf<Lecture>(
Lecture("Lec00001", "Category00001", "How to Learn Java", true),
Lecture("Lec00003", "Category00001", "How to Learn Kotlin", false),
Lecture("Lec00002", "Category00002", "How to Learn Dart", false),
Lecture("Lec00004", "Category00002", "How to Learn JavaScript", true)
)
fun main() {
val category00001LecList = lecList.filter { lec -> lec.categoryID == "Category00001" }
println("Category00001 lecture list: ")
println(category00001LecList)
println()
val bookmarkedLecList = lecList.filter { lec -> lec.isBookmarked == true }
println("\nBookmarked lecture list: ")
println(bookmarkedLecList)
println()
val countOfBookmarkedLectures = lecList.count { lec -> lec.isBookmarked == true }
println("Count of bookmarked lectures: ${countOfBookmarkedLectures}")
println()
val indexOfLec00002Lecture = lecList.indexOfFirst { lec -> lec.lecID == "Lec00002" }
println("Index of Lec00002 lecture: ${indexOfLec00002Lecture}")
println()
lecList.sortWith(compareBy({ it.lecID }, { it.categoryID }, { it.name }, { it.isBookmarked }))
println("Lecture list sorted with lecID, categoryID, name and isBookmarked: ")
println(lecList)
println()
val newSortedLecList = lecList.sortedWith(compareBy({ it.isBookmarked }, { it.lecID }, { it.categoryID }, { it.name }))
println("New lecture list sorted with isBookmarked, lecID, categoryID and name: ")
println(newSortedLecList)
println()
}
지난 안드로이드 개발 팁
- #29 - 프로젝트에 벡터 이미지 추가하기
- #28 - JSON 자료를 데이터 클래스로 자동 변환하는 방법
- #27 - 페이스북 로그인이 안 되는 문제
- #26 - 레이아웃 XML 파일에 이모지 문자 넣는 방법
- #25 - TED permission 라이브러리를 활용한 권한 요청
- #24 - EditText 뷰에 텍스트 입력하고 0.5초 후 액션 설정
- #23 - Uri 객체로부터 읽은 파라메터에서 '+' 문자가 ' '로 바뀌어 있는 문제
- #22 - RxJava 활용하여 몇초 후 코드 실행
- #21 - 맥북 아이클라우드로 프로젝트 복사 후 빌드 안 되는 문제
- #20 - 툴바 정의 방법 (1) 타이틀 및 배경색 설정
- #19 - Index corrupted 오류
- #18 - 오래된 프로젝트의 build.gradle 파일 수정
- #17 - 뷰 바인딩 적용된 프래그먼트에 데이터 바인딩 적용 후 빌드시 발생하는 오류
- #16 - 특정 일이 속하는 주의 모든 날짜를 배열로 구하는 방법
- #15 - RecyclerView에 리스트를 로딩한 후 처리할 일 작성
- #14 - RecyclerView 뷰에서 항목 클릭시 뷰가 깜빡이는 문제
- #13 - 공통으로 사용할 색상 리소스 만들고 뷰에 적용
- #12 - 코틀린 언어 변환시 추가로 수정할 build.gradle 파일들
- #11 - 리스트/배열로부터 찾을 원소의 위치 읽기
- #10 - 앱의 다크 모드 진입 막는 방법
- #9 - 데이터 바인딩/뷰 바인딩 사용하지 않을 경우 자체적으로 만드는 Views 클래스
- #8 - TextView에 linear gradient color 적용하기
- #7 - 다이얼 화면 연결하기 위해 Activity 클래스의 확장 메소드 작성
- #6 - 웹 브라우저를 여는 확장 메소드 작성
- #5 - HTML 적용된 TextView에서 링크 클릭은 어떻게 구현?
- #4 - RxJava의 Observable, Single 객체의 기본 설정 수행 메소드 정의하기
- #3 - 특정 화면 이동시 다른 화면 모두 닫기
- #2 - HTML 이스케이핑 적용된 문자 풀어주기
- #1 - TextView로 HTML 내용 보여주기
Posted through the AVLE Dapp (https://avle.io)
[광고] STEEM 개발자 커뮤니티에 참여 하시면, 다양한 혜택을 받을 수 있습니다.
Upvoted! Thank you for supporting witness @jswit.