小编s1m*_*nw1的帖子

Kotlin将类型函数作为函数扩展来实现 - 可以从Java调用吗?

我正在尝试使用具有reified类型的函数作为扩展函数,但我不认为这是可能的,因为在我检查生成的字节码后我发现方法签名是私有的,是否有任何解决方法使其公开?

CommonExtensions.kt

inline fun<reified T: Activity> Context.startActivity() {
    val intent = Intent(this, T:: class.java)
    startActivity(intent)
}

fun View.visible() {
    visibility = View.VISIBLE
}
Run Code Online (Sandbox Code Playgroud)

Kotlin字节码:

private final static startActivity(Landroid/content/Context;)V
    @Lorg/jetbrains/annotations/NotNull;() // invisible, parameter 0
   ...
Run Code Online (Sandbox Code Playgroud)

客户代码:

Kotlin文件

override fun showMessageEmptyOfferFeeds() {
        mOfferFeedsWarning.visible() // "visible()" extension func RESOLVED
}
Run Code Online (Sandbox Code Playgroud)

Java文件

showProfileDetailsUi(){
   startActivity<DetailActivity>() //"startActivity()" extension func NOT RESOLVED
}
Run Code Online (Sandbox Code Playgroud)

java kotlin kotlin-android-extensions kotlin-reified-type-parameters

5
推荐指数
1
解决办法
672
查看次数

"Lambda with Receiver":这个Kotlin构造是什么?

我正在看这个Kotlin对象声明:

object A : B({
    variableName1 = "text1"
    variableName2 = "text2"

    params {
        param("Foo", "Bar")
    }
})
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚B类构造函数的参数是什么.

我有目的地在这个例子中抽象出信息,但实际上是B类

jetbrains.buildServer.configs.kotlin.v10.BuildType
Run Code Online (Sandbox Code Playgroud)

我找不到该类型的文档.我发现了一些接近的东西,但它是一个接口的定义,因此没有构造函数.

总而言之,Kotlin的以下构造是什么?

{
    variableName1 = "text1"
    variableName2 = "text2"

    params {
        param("Foo", "Bar")
    }
}
Run Code Online (Sandbox Code Playgroud)

dsl lambda receiver kotlin

5
推荐指数
1
解决办法
627
查看次数

如何在 Kotlin 中设置非内联 OnClickListener?

我想将 a 附加View.OnClickListener到 a Button。我不想OnClickListener成为内联匿名函数定义。相反,我想在onCreateView()函数范围之外定义它。

在 Java 中,我会这样做:

@Override public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                       Bundle savedInstanceState)
{
    View view = inflater.inflate(R.layout.my_layout, container, false);
    View my_btn = view.findViewById(R.id.my_btn);
    my_btn.setOnClickListener(handleButtonClick);
    return view;
}

View.OnClickListener handleButtonClick = new View.OnClickListener()
{
    @Override public void onClick(View v) 
    {
        Log.d("my_tag", "click!")
    }
}
Run Code Online (Sandbox Code Playgroud)

其他答案似乎表明以下内容可行,但它不适合我:

    override fun onCreateView(name: String?, context: Context?, attrs: AttributeSet?): View
    {
        var view = super.onCreateView(name, context, attrs)
        my_btn.setOnClickListener( handleButtonClick  )
        return view
    }

    private val …
Run Code Online (Sandbox Code Playgroud)

android kotlin

5
推荐指数
1
解决办法
2736
查看次数

Java 8流限制功能是否有任何等效的Kotlin功能

我试图在列表中找到符合条件(过滤)的前两个元素,为此我在kotlin中实现了以下代码:

val arr = 0 until 20

val res = arr.filter { i ->
        println("Filter: $i")
        i % 2 == 0
    }.take(2)
Run Code Online (Sandbox Code Playgroud)

一切都很好,直到我意识到它过滤整个列表,无论是否找到了这两个元素.

使用Java 8 stream api,它按预期工作.

val res2 = arr.toList().stream()
     .filter { i ->
          println("Filter: $i")
          i % 2 == 0
     }.limit(2)
Run Code Online (Sandbox Code Playgroud)

所以我的问题是如果只使用Kotlin功能就可以实现.

我知道我可以使用一个简单的for循环,但我想使用函数式编程方法.

java functional-programming java-8 kotlin java-stream

5
推荐指数
2
解决办法
642
查看次数

对列表进行排序 Kotlin

我有一个列表,(x, y)其中y只能是 0 或 1 像这样

例如 :

[(3, 0), (3, 1), (5, 1)]
[(5, 0), (3, 1), (5, 1)]
[(1, 1), (3, 1), (5, 1)]
[(3, 0), (4, 0), (5, 1)]
[(5, 0), (4, 0), (5, 1)]
[(1, 1), (4, 0), (5, 1)]
[(3, 0), (3, 1), (5, 1)]
[(5, 0), (3, 1), (5, 1)]
[(1, 1), (3, 1), (5, 1)]
Run Code Online (Sandbox Code Playgroud)

如何对列表进行排序以使最多的子列表y = 0位于顶部?

kotlin

5
推荐指数
1
解决办法
5376
查看次数

Kotlin 中集合的构建器语法

我正在启动 Kotlin 并希望以构建器语法的模式配置Arrayof Labels。我想出了 Kotlin 标准库函数 ( apply) 和集合上的辅助函数 ( forEach)。将其称为构建器模式是否正确?这对我来说意味着声明、分配和配置在一行/一步中完成。我很欣赏任何关于如何以更紧凑和清晰的“Kotlin 式”方式编写它的想法,或者这或多或少是首选的 Kotlin 语法。顺便说一句,有很多方法可以解决这个问题(使用let而不是apply不返回接收器)。

val labels = arrayOf(Label("A"),Label("B"),Label("C"),Label("D")).apply {
    this.forEach { it.prefWidth = 50.0 }
}
Run Code Online (Sandbox Code Playgroud)

collections builder kotlin

5
推荐指数
1
解决办法
230
查看次数

Kotlin:类型不匹配:推断类型为 String 但预期为 String.Companion

第 5 行和第 6 行错误。

Kotlin:类型不匹配:推断类型为 String 但预期为 String.Companion

class Robot (name: String,color :String) {

    var roboName= String
    var roboColor= String
    init {
        this.roboName=name
        this.roboColor=color
        }
    fun makeBed()
    {
        println("I will make your bed.")

    }

}
fun main(args: Array<String>){

     var robot1=Robot("Robot1","Black")
      println(robot1.roboName)
      println(robot1.roboColor)
      robot1.makeBed()
}
Run Code Online (Sandbox Code Playgroud)

kotlin

5
推荐指数
2
解决办法
3万
查看次数

Kotlin:如何在Joda间隔内迭代所有日期?

我想迭代给定Joda间隔内的所有日期:

val interval = Interval(DateTime.now().minusDays(42), DateTime.now())
Run Code Online (Sandbox Code Playgroud)

如何在Kotlin中做到这一点?

jodatime intervals kotlin

5
推荐指数
2
解决办法
553
查看次数

使用 Kotlin 的 `let` 的合理情况

在 Kotlin 中,let如果对象(let接收者)不是null,则执行代码是很常见的,作为if != null检查的替代方法,如下所示:

val nullable: String? = "anything"
nullable?.let {
    println(it)
}
Run Code Online (Sandbox Code Playgroud)

在其他什么情况下使用let?

仅供参考,let是 Kotlin 标准库的一部分,定义如下:

@kotlin.internal.InlineOnly
public inline fun <T, R> T.let(block: (T) -> R): R = block(this)
Run Code Online (Sandbox Code Playgroud)

android kotlin

4
推荐指数
1
解决办法
1342
查看次数

Kotlin:找到收藏中最常见的元素

我正在编写一个迭代一个集合的函数,并找到其中最常见的项目.

以下是我到目前为止获取值并添加它们在集合中出现的次数.我将值作为键放在地图中,并将其显示为其值的次数.

fun mostCommon(input: Collection<Int>): Set<Int> {
    var newMap: MutableMap<Int, Int> = HashMap()
    for (item in input) {
        if (newMap.containsKey(item)) {
            //TODO: add 1 to value if key is found
        }else {
            newMap.put(item, 1)
        }
    }
    return emptySet()
}
Run Code Online (Sandbox Code Playgroud)

如果密钥已存在,我无法找到将值加1的方法.

我试过这样做:

newMap[item] +=1
Run Code Online (Sandbox Code Playgroud)

但我得到一个关于plusAssign(1)的错误,不允许在Nullable接收器上.

hashmap kotlin

4
推荐指数
2
解决办法
2440
查看次数