繁体   English   中英

在 kotlin 中创建 Lambda 函数

[英]Create Lambda function in kotlin

我正在努力将我的 java 代码转换为 kotlin 代码,但我陷入了无法转换我之前编写的 lambda 函数的地步

 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);
    }

}

这就是我在 Java 的 MainActivity 中使用它的方式

 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);
          });
     }
}

我在 Kotlin 中的 Utils 类

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)
    }

}

我如何才能在 kotlin 中仅在 MainActivity 中实现相同的目标,将不胜感激。

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

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

参考此信息,您可以清楚地了解使用带参数和不带参数的 lambda 函数

你必须像这样改变你的 Utils 类函数

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)
}


}

你可以像这样在 MainActivity 中调用它:

class MainActivity : AppCompatActivity() {


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

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

          useInfos(infos);
      })

}

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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