Kotlin 고급 함수 사용 리 셋 방식

lambda 와 고급 함수
이전에 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 에서 고급 함 수 를 사용 하여 전통 적 인 반전 함 수 를 대체 하 는 방법 입 니 다.잘못된 점 은 지적 하여 바로잡아 주 십시오.여러분 께 참고 가 되 셨 으 면 좋 겠 고 많은 응원 부 탁 드 리 겠 습 니 다.

좋은 웹페이지 즐겨찾기