简体   繁体   中英

Create Lambda function in kotlin

I am working on converting my java code to kotlin code ,But I am stuck at a point where I am not able to convert my lambda function which I previously written

 class Utils {


    interface Callback {
        void onResult(MediaCodecInfo[] infos);
    }

    static final class EncoderFinder extends AsyncTask<String, Void, MediaCodecInfo[]> {
        private Callback func;

        EncoderFinder(Callback func) {
            this.func = func;
        }

        @Override
        protected MediaCodecInfo[] doInBackground(String... mimeTypes) {
            return findEncodersByType(mimeTypes[0]);
        }

        @Override
        protected void onPostExecute(MediaCodecInfo[] mediaCodecInfos) {
            func.onResult(mediaCodecInfos);
        }
    }

    static void findEncodersByTypeAsync(String mimeType, Callback callback) {
        new EncoderFinder(callback).execute(mimeType);
    }

}

This is how I used it in MainActivity in java

 public class MainActivity extends Activity {


 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

          Utils.findEncodersByTypeAsync("abc", infos -> {

              useInfos(infos);
          });
     }
}

My Utils class in Kotlin

object Utils {


    internal interface Callback {
        fun onResult(infos: Array<MediaCodecInfo?>?)
    }


    internal class EncoderFinder(func : Callback) : AsyncTask<String,Void,Array<MediaCodecInfo?>?>(){

        var func : Callback = func


        override fun doInBackground(vararg params: String?): Array<MediaCodecInfo?>? {
            return findEncodersByType(params[0])
        }

        override fun onPostExecute(result: Array<MediaCodecInfo?>?) {
            func.onResult(result)
        }

    }

    internal fun findEncodersByTypeAsync(mimeType: String?, callback: Callback){
        EncoderFinder(callback).execute(mimeType)
    }

}

How can I achieve same in kotlin only in MainActivity, small help will be appreciated.

Utils.findEncodersByTypeAsync("abc") { useInfos(it) }

https://medium.com/mindorks/lambda-function-in-kotlin-22ded595298

Refer this information you get clear understanding of using lambda function with and without parameters

you have to change you Utils class function like this

object Utils {


    internal interface Callback {
        fun onResult(infos: Array<MediaCodecInfo?>?)
    }


    internal class EncoderFinder(func : Callback) : AsyncTask<String,Void,Array<MediaCodecInfo?>?>(){

        var func : Callback = func


        override fun doInBackground(vararg params: String?): Array<MediaCodecInfo?>? {
            return findEncodersByType(params[0])
        }

        override fun onPostExecute(result: Array<MediaCodecInfo?>?) {
            func.onResult(result)
        }

    }

   internal fun findEncodersByTypeAsync(mimeType: String?, callback: (Array<MediaCodecInfo?>?) -> Unit){
    EncoderFinder(callback as Callback).execute(mimeType)
}


}

and you can call it in MainActivity Like this :

class MainActivity : AppCompatActivity() {


     @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)

              Utils.findEncodersByTypeAsync("abc", infos -> {

          useInfos(infos);
      })

}

}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM