惰性成员的惰性初始化

如果我们有一个成员variables定义为 private var foo: Foo? = null 当我们调用带有参数的方法(需要初始化Foo)时,我们想要初始化它,还有更好的方法吗? fun generateFoo(bar: Bar): Foo { var localFoo = foo if (localFoo == null) { localFoo = Foo(bar) foo = localFoo } return localFoo } 我正在考虑避免所有的variables赋值。 编辑:稍微短一点的版本在这里,但仍然不理想 fun generateFoo(bar: Bar): Foo { var localFoo = foo ?: Foo(bar) foo = localFoo return localFoo }

在Kotlin中如果不是null,则返回原地方式

我正在寻找一种惯用的方式来返回如果不是null在Kotlin中的variables。 例如,我想要的东西如: for (item in list) { getNullableValue(item).? let { return it } } 但是不可能在Kotlin的一个区块里面回来。 有没有一个好办法做到这一点,而不必这样做: for (item in list) { val nullableValue = getNullableValue(item) if (nullableValue != null) { return nullableValue } }

Kotlin – 在循环解构不工作 – var不可访问

一些背景 : val (name, age) = person 这个语法被称为解构声明。 它在同一时间创建多个variables( 更正,创建多个值 )。 解构声明也适用于for循环:当你说: for ((a, b) in collection) { … } 让我们看看我有一个列表项: @Parcelize data class MyModel( var name: String = “”, var is_locked: Boolean = true, var is_one_size: Boolean = false, ) : Parcelable 现在我已经获得了“MyModel”类的列表,我试图循环他们像这样: private fun initMyModelList(model: MutableList) { //i want to access is_locked from […]

在Kotlin中有两个types参数个数不同的函数

这两个function相互冲突。 有没有解决这个问题的方法? inline fun foo() = … inline fun foo() = … 谢谢! 编辑: 我发现方便(至少对我来说)这个问题的解决方案: inline fun foo() = foo() inline fun foo(type1: KClass = T::class, type2: KClass = I::class) = … 如果您选择仅添加一个参数,则可以更简洁。 以后你可以像这样使用它: val x = foo() val y = foo() 这就是我所需要的。

属性getter在Supertype上输入,而不是在Kotlin中执行

假设我有两个类,一个Base和一个扩展Base的Impl 。 package mypackage open class Base class Impl : Base() 我将如何创建一个私有属性的具体Impltypes(内部使用) ,与一个公共的getter键入为Basetypes ,实现多态? 我最初的方法是这样的: class Test { private val myType = Impl() get():Base } 但是,Kotlin编译器抱怨: 错误:(30,11)Kotlin:Getter返回types必须等于属性的types,即’mypackage.Impl’ 基本上,这就是它在普通Java中的样子: public class Test { private Impl myImpl = new Impl(); public Base getBase() { return myImpl; } } 怎么能做到这一点? 我错过了什么吗? PS我知道Backing Fields和创建自定义方法作为getter的解决方法,我只是好奇如何以优雅,Kotlin风格的方式来处理这个问题。

在android sdk 27​​更改日期选取器的标题

我在我的android应用程序中实现android DatePickerDialog 。 以前,我已经能够调用DatePickerDialog.setTitle()方法来改变对话框的标题。 但是,在使用Android SDK 27创建项目时, DatePickerDialog.setTitle()调用似乎不会执行任何操作, DatePickerDialog.setTitle()调用也不会执行任何操作。 这是我的电话代码: class DatePickerFragment : DialogFragment(), DatePickerDialog.OnDateSetListener { override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { val c = Calendar.getInstance() val datePickerDialog = DatePickerDialog(activity, this@DatePickerFragment, c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.get(Calendar.DAY_OF_MONTH)) datePickerDialog.setTitle(“I was born on…”) return datePickerDialog } override fun onDateSet(p0: DatePicker?, p1: Int, p2: Int, p3: Int) { TODO(“Do something…”) } […]

com.android.builder.dexing.DexArchiveMergerException:无法在运行时合并dexexception

错误:任务’:app:transformDexArchiveWithExternalLibsDexMergerForDevDebug’的执行失败。 java.lang.RuntimeException:com.android.builder.dexing.DexArchiveMergerException:无法合并dex 的build.gradle apply plugin: ‘com.android.application’ apply plugin: ‘kotlin-android’ apply plugin: ‘kotlin-kapt’ android { compileSdkVersion 27 buildToolsVersion project.buildToolVersion dataBinding { enabled = true } productFlavors { dev { applicationIdSuffix “.dev” buildConfigField ‘String’, ‘HOST’, ‘”https://raconfiguratorqa.symx.com”‘ resValue ‘string’, ‘google_maps_key’, “AIzaSyDqXirXTahZHrKeSW62kmY3236S1Cqu4c4” } production { buildConfigField ‘String’, ‘HOST’, ‘”https://raconfiguratorqa.symx.com”‘ resValue ‘string’, ‘google_maps_key’, “AIzaSyDqXirXTahZHrKeSW62kmY3236S1Cqu4c4” } } signingConfigs { config { […]

错误:链接引用失败。 – > QueuedJob

我正在研究使用Kotlin的Android材质设计,一切都很好,直到我尝试使用android.support.design.widget.FloatingActionButton。 当我重建项目时,我得到了下面的错误信息: Information:Gradle tasks [clean, :app:assembleDebug] C:\Users\qin\.gradle\caches\transforms-1\files-1.1\appcompat-v7-26.1.0.aar\3d5ddc383685b19d22429a29e09f2aeb\res\values\values.xml Error:(1419, 5) error: style attribute ‘attr/textColor (aka br.com.conseng.themedesign:attr/textColor)’ not found. Error:(1525, 5) error: style attribute ‘attr/textColor (aka br.com.conseng.themedesign:attr/textColor)’ not found. …..\CursoMaterialDesign\ThemeDesign\app\build\intermediates\incremental\mergeDebugResources\merged.dir\values\values.xml Error:(1843) style attribute ‘attr/textColor (aka br.com.conseng.themedesign:attr/textColor)’ not found. Error:(1953) style attribute ‘attr/textColor (aka br.com.conseng.themedesign:attr/textColor)’ not found. Error:failed linking references. Error:java.util.concurrent.ExecutionException: java.util.concurrent.ExecutionException: com.android.tools.aapt2.Aapt2Exception: AAPT2 error: check logs for […]

Kotlin:单一财产与多个不同types的制定者

我试图建立一个具有LocalDatetypes属性的类,它具有接受不同types的setter: LocalDate或String 。 在LocalDate情况下,值被直接分配,在String情况下,它被解析,然后分配。 在Java中,我只需要实现两个处理上述情况的重载setter。 但我不知道如何处理在Kotlin。 我试过这个: class SomeExampleClass(var _date: LocalDate) { var date = _date set(value) { when(value) { is LocalDate -> value is String -> LocalDate.parse(value) } } } 它不编译。 我该如何解决这个问题?

把这个java代码翻译成kotlin的最好方法

URL url = new URL(urlSpec); HttpURLConnection connection = (HttpURLConnection)url.openConnection(); InputStream in = connection.getInputStream(); int bytesRead = 0; byte[] buffer = new byte[1024]; while ((bytesRead = in.read(buffer)) > 0) { out.write(buffer, 0, bytesRead); } out.close(); 我特别好奇这个部分 while(bytesRead = in.read(buffer)) 我们知道asigements在kotlin中被视为语句,而在java中则被视为expression式,所以这个构造只能在java中使用。 将这个java代码转换成kotlin的最好方法是什么?