Kotlin 고급 함수 사용 리 셋 방식
이전에 lambda 와 고급 함 수 를 배 운 다음 에 안 드 로 이 드 개발 에서 onClick 사건 을 감청 하 는 것 은 자주 사용 하 는 기능 입 니 다.kotlin 의 일반적인 실현 은 다음 과 같 습 니 다.
rootView.setOnClickListener { view ->
println(" ID=${view.id} view")
}
그리고 개발 과정 에서 불가피 하 게 사용자 정의 감청 같은 코드 를 써 야 합 니 다.이 럴 때 자바 의 사상 으로 이 루어 진다 면 좀 가 까 운 것 을 버 리 고 먼 것 을 추구 할 것 이다.자바 사상 실현
자바 에서 저희 의 일반적인 방법 은 이 렇 습 니 다.
인터페이스 정의
인터페이스 형식 변 수 를 정의 합 니 다.
set 방법 정의
set 방법 으로 인터페이스의 실현 클래스 를 설정 합 니 다.
kotlin 으로 이 루어 지면 다음 과 같 습 니 다.
class MyView{
//
interface IOnLabelCheckedListener {
fun onLabelCheck(label: String)
}
//
private var onLabelChecked: IOnLabelCheckedListener? = null
private fun initView(context: Context) {
view.setOnCheckedChangeListener { radioGroup, i ->
onLabelChecked.onLabelCheck(radioGroup.findViewById<RadioButton>(i).text.toString())
}
}
// set
fun setOnLabelCheckedListener(e: IOnLabelCheckedListener) {
this.onLabelChecked = e
}
}
// set ,
MyView.setOnLabelCheckedListener(object : LabelBarView.IOnLabelCheckedListener {
override fun onLabelCheck(label: String) {
}
})
이렇게 실현 되 는 문제너무 복잡 하지.그리고 처음에 이렇게 썼 는데 왜 MyView.setOn Label CheckedListener 방법 내부 에 lambda 표현 식 이 들 어 오지 못 하 는 지 모 르 겠 어 요.lambda 표현 식 의 존 재 는 익명 의 내부 클래스 를 대체 하기 위 한 것 이 잖 아 요.그리고 이 인터페이스 가 자바 형식의 인 터 페 이 스 를 정의 한다 면 lambda 표현 식 을 사용 할 수 있 습 니 다.왜 이래?마지막 으로 kotlin 이 자바 와 서로 호출 할 때 중간 에 또 한 층 을 감 쌌 기 때 문 이 라 고 추측 합 니 다.우 리 는 kotlin 을 직접 사용 하여 이 인터페이스 에 중간 층 이 존재 하지 않 는 다 고 정의 합 니 다.우리 가 정의 하 는 set 방법 은 고급 함수 도 아니 고 lambda 표현 식 을 사용 할 수 없습니다.
다음은 kotlin 의 사상 으로 회 조 를 실현 하 겠 습 니 다.
고급 함 수 를 사용 하여 실현 하 다.
kotlin 과 자바 의 중요 한 차이 점 은 함수 식 프로 그래 밍 입 니 다.함수 식 프로 그래 밍 의 사상 에서 함 수 는 일등 공민 이 므 로 kotlin 을 사용 할 때 우 리 는 이런 사 고 를 많이 이용 하여 문 제 를 생각해 야 한다.Kotlin 에서 고급 함 수 를 제 공 했 습 니 다.함 수 를 직접 사용 하여 반환 값 으로 사용 할 수 있 습 니 다.자바 프로 그래 밍 에 익숙 한 저 에 게 는 처음에 이해 하기 가 어 려 웠 습 니 다.다음은 제 가 고급 함 수 를 실현 하 는 방향 을 적어 서 여러분 께 도움 이 되 기 를 바 랍 니 다.
우선,생각 나 는 것 은 함수 전달 입 니 다.익명 내부 클래스 를 lambda 로 대체 해 야 합 니 다.이렇게 실현 할 수 있 습 니 다.
// , lambda
MyView.setOnLabelCheckedListener(object : MyView.IOnLabelCheckedListener {
override fun onLabelCheck(label: String) {
println(label)
}
})
// MyView.IOnLabelCheckedListener onLabelCheck(label: String)
// lambda
var lam: (String) -> Unit = { label -> println(label) }
그리고 다 쓴 lambda 를 전달 해 야 합 니 다.이 럴 때 setOn Label Checked Listener 방법 은 고급 함수 입 니 다.
// lam , e
fun setOnLabelCheckedListener(e: (String) -> Unit) {
this.lisenter = e
}
// lisenter
var linsnter: (String) -> Unit = {}
마지막 으로 linsnter 를 사용 하여 리 셋 을 진행 합 니 다.
private fun initView(context: Context) {
view.setOnCheckedChangeListener { radioGroup, i ->
linsnter(radioGroup.findViewById<RadioButton>(i).text.toString())
}
}
최종 코드 결과:
class MyView{
var linsnter: (String) -> Unit = {}
private fun initView(context: Context) {
view.setOnCheckedChangeListener { radioGroup, i ->
linsnter(radioGroup.findViewById<RadioButton>(i).text.toString())
}
}
fun setOnLabelCheckedListener(e: (String) -> Unit) {
this.lisenter = e
}
}
// lam ,
view.setOnLabelCheckedListener { label ->
println(label)
}
최종 코드 는 이전 코드 와 두 가지 가장 큰 차이 가 있 습 니 다.하 나 는 인터페이스 정의 가 없 는 것 이 고 다른 하 나 는 익명 내부 류 가 없습니다.고급 함 수 를 더 잘 사용 하 다.
고급 함수 의 사용 이 더 많 을 때 우리 의 코드 를 더욱 간결 하 게 할 수 있다.예 를 들 어 다음 코드:
fun refreshData(e: ((Boolean, String) -> Unit)): Boolean {
if (!UserInfoManager.getInstance().isLogin) {
e(false, " ")
return false
}
NETWorkUtils.request(ApiParamter(), object : ApiListener<ResponseData> {
override fun onApiCompleted(data: ResponseData?) {
e(true, " ")
}
override fun onApiError(errorCode: Int, errorCodeMessage: String) {
e(false, errorCodeMessage)
}
})
return true
}
그러면 호출 할 때 이렇게 할 수 있 습 니 다.
mView.refreshData { isSuccess, msg ->
//do something
}
간단 하지 않 습 니까?인 터 페 이 스 를 하나 더 쓰 지 않도록 하 세 요.또한 자바 로 refreshdata 를 호출 하 는 방법 도 마찬가지 입 니 다.
mView.refreshData(new Function2<Boolean, String, Unit>() {
@Override
public Unit invoke(Boolean aBoolean, String s) {
// do something
return null;
}
});
Kotlin 은 자바 가 고급 함 수 를 호출 할 때 사용 할 수 있 도록 일련의 Function 인터페이스 류 를 제공 합 니 다.최대 22 개의 매개 변 수 를 지원 합 니 다.관심 있 는 것 은 볼 수 있 습 니 다.이상 은 Kotlin 에서 고급 함 수 를 사용 하여 전통 적 인 반전 함 수 를 대체 하 는 방법 입 니 다.잘못된 점 은 지적 하여 바로잡아 주 십시오.여러분 께 참고 가 되 셨 으 면 좋 겠 고 많은 응원 부 탁 드 리 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
머티리얼 디자인 도입 직후에 할 일안드로이드 프로젝트에 머티리얼 디자인을 도입한 후에 할 일을 적는다. Android 프로젝트를 만든 후 Hello world에 대해 수행합니다. 머티리얼 디자인을 도입하기 위해, build.gradle 를 이하와 같...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.