【问题标题】:Create Lambda function in kotlin在 kotlin 中创建 Lambda 函数
【发布时间】:2019-12-11 10:23:05
【问题描述】:

我正在努力将我的 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 中实现相同的功能,我们将不胜感激。

【问题讨论】:

  • 小提示。如果您使用来自 Jetbrains(也创建了 Kotlin)的 IntelliJ IDEA,您可以将粘贴的 Java 代码复制到 Kotlin 文件中,它会自动为您转换。结果并不总是最漂亮的,但它会是 Kotlin。

标签: java android kotlin lambda


【解决方案1】:
Utils.findEncodersByTypeAsync("abc") { useInfos(it) }

【讨论】:

  • 不能以这种方式工作,需要提供错误 Utils.Callback ,找到 ()-> 单位
  • onResult() 返回无效。 kotlin 中的单位是一样的。你确定这段代码在java中工作吗?
  • findEncodersByTypeAsync(mimeType: String, callback: (List&lt;MediaCodecInfo&gt;) -&gt; Unit) { ... }
  • 点评来源: 您好,请不要只用源代码回答。尝试对您的解决方案如何工作提供一个很好的描述。请参阅:How do I write a good answer?。谢谢
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    你必须像这样改变你的 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);
          })
    

    }

    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-23
      • 2021-08-13
      • 2021-07-18
      • 2020-03-27
      相关资源
      最近更新 更多