Kotlin 의 자바 함수 식 인터페이스 사용

2406 단어
lambda 를 매개 변수 로 자바 에 전달 하 는 방법lambda 기대 함수 식 인터페이스 에 전달 할 수 있 는 방법

void postponeCompution(int delay,Runnable computation);

Kotlin 에 서 는 그것 을 호출 하여 하나의 lambda 를 실제 인삼 으로 전달 할 수 있 습 니 다.컴 파일 러 는 자동 으로 그것 을 Runnable 의 인 스 턴 스 로 변환 합 니 다.
postponeCompution(1000){println(42)}

표 시 를 통 해 Runnable 을 실현 한 익명 대상 을 만 드 는 것 도 같은 효 과 를 얻 을 수 있 습 니 다.
postponeCompution(1000,object:Runnable{
        override fun run(){
            println(42)
        }
})

그러나 여 기 는 조금 다 릅 니 다. 대상 을 표시 할 때 호출 할 때마다 새로운 인 스 턴 스 를 만 듭 니 다.사용 lambda 을 사용 하면 lambda 함수 의 변 수 를 사용자 정의 하 는 데 접근 하지 않 으 면 해당 익명 클래스 인 스 턴 스 는 여러 번 호출 할 때 다시 사용 할 수 있 습 니 다.
 postponeCompution(1000){println(42) 

따라서 완전 등가 의 실현 은 다음 코드 의 표시 object 성명 이 어야 합 니 다. Runnable 인 스 턴 스 를 하나의 변수 에 저장 하고 호출 할 때마다 이 변 수 를 사용 합 니 다.
val runnable = Runnable{ println(42) } 
fun handleCompution(){
    postponeCompution(1000,runnable) 
}
lambda 이 를 둘 러 싼 역할 영역 에서 변 수 를 포착 하면 호출 할 때마다 같은 인 스 턴 스 를 다시 사용 할 수 없습니다.이 경우 호출 할 때마다 컴 파일 러 가 새 대상 을 만 듭 니 다.
fun handleCompution(id:String){ 
    postponeCompution(1000){println(id)} 
}

SAM 구조 방법: lambda 를 함수 식 인터페이스 로 표시 합 니 다.SAM 구조 방법 은 컴 파일 러 가 생 성 한 함수 로 lambda 에서 함수 식 인터페이스 인 스 턴 스 로 전환 하 는 것 을 실행 합 니 다.만약 한 방법 이 하나의 함수 가 인터페이스의 인 스 턴 스 라면, 직접 lambda 로 돌아 갈 수 없 으 며, SAM 구조 방법 으로 그것 을 포장 해 야 한다.
fun createAllDoneRunnable() : Runnable{
    return Runnable{ println("All done!") }
}
SAM 구조 방법 은 하나의 매개 변수 만 받 습 니 다. 함수 식 인터페이스 단일 추상 적 인 방법 체 lambda 로 사용 되 고 이 인 터 페 이 스 를 실현 하 는 인 스 턴 스 를 되 돌려 줍 니 다.
val listener = OnClickListener { view ->
    
    val text = when(view.id){
        R.id.button1 -> "First button"
        R.id.button2 -> "Second button"
        else -> "Unknow Button"
    }
    
    toast(text)
}

button1.setOnClickListener(listener)
button2.setOnClickListener(listener)

좋은 웹페이지 즐겨찾기