with과 apply는 편리하며 다수의 사람이 사용중이다. 코틀린 람다의 독특한 기능인 지정 람다는 수신 객체를 명시하지 않고 람다의 본문 안에서 다른 객체의 메서드를 호출한다. (1) with 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 alphabet(): String { val stringBuilder = StringBuilder() return with(stringBuilder) { // 메서드를 호출하려는 수신 객체 지정 for..
Kotlin에서 사용하는 대부분의 API들은 자바로 작성되어 있다. 하지만, Kotlin의 람다를 Java API에 사용하더라도 큰 문제는 없다. 자바 8 이후로는 무명 클래스 인스턴스 대신 람다를 넘길 수 있다. (1) 자바 메서드에 람다를 인자로 전달 함수형 인터페이스를 인자로 원하는 자바 메서드에 코틀린 람다를 전달할 수 있다. 람다에 대해 무명 클래스를 만들고, 그 클래스의 인스턴스를 만들어서 메서드에 넘기는 것은 함수형 인터페이스를 받는 자바 메서드를 코틀린에서 호출할 떄 쓰는 방식을 설명해주지만, 컬렉션을 확장한 메서드에 람다를 넘기는 경우에는 사용하지 않는다. inline으로 표시된 코틀린 함수를 람다에게 넘기면 아무 무명 클래스도 만들어지지 않는다. (2) SAM 생성자: 람다를 함수형 인..
people.asSequence() // 원본 컬렉션을 시퀀스로 변환 .map(Person::name) .filter { it.startsWith("A") } // 시퀀스도 컬렉션과 동일한 API 제공 .toList() // 결과 시퀀스를 다시 리스트로 변환 map이나 filter같은 컬렉션 함수들은 결과 컬렉션을 즉시 생성한다. 이는 컬렉션 함수를 연쇄하면 매 단계 마다 계산 중간 결과를 새로운 컬렉션에 담는다는 의미이다. 연산을 효율적으로 사용하기 위해선 각 연산이 컬렉션을 직접 사용하는 대신 시퀀스를 사용하게 만들어야 한다. [Sequence] 해당 시퀀스를 사용 시 중간 임시 컬렉션을 사용하지 않고 컬렉션 연산을 연쇄하는 것이 가능하다. Kotlin의 지연 계산 시퀀스는 Sequence 인터페이스..
(1) filter와 map val list= listOf(1, 2, 3, 4) println(list.filter { it % 2 == 0 }) // [2, 4] val people = listOf(Person("Alice", 29), Person("Bob", 31)) println(people.filter { it.age > 30 }) // [Person(name=Bob, age=31)] [filter] 컬렉션을 이터레이션하면서 주어진 람다에 각 원소를 넘겨서 람다가 true를 반환하는 원소만 모은다. 주어진 술어를 만족하는 모든 원소를 선택한다. (술어란 참/거짓을 반환하는 함수를 말함.) 컬렉션에서 원치 않는 원소를 제거한다. 하지만 변환하는 것은 불가능하다. val list = listOf(1,..
람다는 기본적으로 다른 함수에 넘길 수 있는 작은 코드 조각을 뜻한다. 이를 사용하면 쉽게 공통 코드 구조를 라이브러리 함수로 뽑아내는 것이 가능하다. (1) 람다 소개: 코드 블럭을 함수 인자로 넘기기 button.setOnClickListener(new OnClickListener) { @Override public void onClick(View view) { /* 버튼을 클릭 시 실행 할 동작 */ } } button.setOnClickListener { /* 버튼을 클릭 시 실행 할 동작*/ } 함수형 프로그래밍에서는 함수를 하나의 값 처럼 다루어서 번거로운 문제들을 해결한다. 클래스를 선언하고 인서턴스를 함수에 넘기는 대신, 함수를 직접 다른 함수에 전달한다. 람다 식을 사용하면, 함수를 선언..
DRY 원칙(Don't Repeat Yourself)을 피하기는 쉽지 않다. 메서드 추출 리팩토링을 통해서 긴 메서드를 부분부분 나눠서 재활용 하는 것은 가능하다. 해당 해결방법의 경우 더 복잡해지기에, 메서드를 별도의 내부 클래스에 넣게 된다면 불필요한 준비코드가 늘어난다. Kotlin에서는 추출한 함수를 원 함수에 중첩시킬 수 있다. class User(val id: Int, val name: String, val address: String) fun saveUser(user: User) { if(user.name.isEmpty()) { throw IllegalArgumentException( "Can't save user ${user.id}: Empty Name" ) } if(user.address..