小编vod*_*dan的帖子

在科特林的`forEach`中`break`和`continue`

科特林具有非常不错的迭代功能,如forEachrepeat,但我不能让breakcontinue运营商与他们(包括本地和非本地)的工作:

repeat(5) {
    break
}

(1..5).forEach {
    continue@forEach
}
Run Code Online (Sandbox Code Playgroud)

目标是模拟通常的循环,其功能语法尽可能接近.在某些旧版本的Kotlin中肯定是可能的,但我很难重现语法.

问题可能是标签的错误(M12),但我认为第一个例子应该可行.

在我看来,我已经阅读过关于特殊技巧/注释的某处,但我找不到关于这个主题的任何参考.可能如下所示:

public inline fun repeat(times: Int, @loop body: (Int) -> Unit) {
    for (index in 0..times - 1) {
        body(index)
    }
}
Run Code Online (Sandbox Code Playgroud)

foreach lambda loops kotlin

87
推荐指数
7
解决办法
4万
查看次数

forEach inside in Kachlin

在Kotlin中,如果要使用该元素forEach,可以使用it关键字.所以现在我想知道如果我有这样的forEach内部我应该怎么做forEach:

list.forEach {
    val parent = it
    it.forEach {
        // `it` now become the element of the parent.
    }
}
Run Code Online (Sandbox Code Playgroud)

我认为只为命名约定定义一个新变量是如此愚蠢.有这个问题的任何其他解决方案?

foreach kotlin

25
推荐指数
1
解决办法
2万
查看次数

Kotlin对象与伴随对象与包范围方法

我已经在Kotlin中编写了这些方法并分析了字节码:

情况1

class A {
    object b {
        fun doSomething() {}
    }
}
Run Code Online (Sandbox Code Playgroud)

情况2

class A {
    companion object b {
        fun doSomething() {}
    }
}
Run Code Online (Sandbox Code Playgroud)

情况3

fun doSomething() {}
Run Code Online (Sandbox Code Playgroud)

字节码结果

  • 情况1:上课Test$asb,public final doSomething()I
  • 情况2:上课Test$Companion,public final doSomething()I
  • 情况3:上课TestKt,public final static doSomething()I

我的问题是:

  • 我有一个枚举类,我想在给定枚举变量的情况下返回一个枚举实例,例如findById (enum(id, color)).我该怎么办?伴侣对象?宾语?

  • 似乎有一个真正的静态方法的唯一方法是在包级别,没有类声明.但这有点过于全球化.有没有办法通过以下方式访问它:ClassName.staticMethod,staticMethod是非常静态的.

  • 提供有意义的包声明方法,伴随对象和对象的示例.

语境.我一直在Kotlin编码,我发现它很棒.但有时我需要做出决定:例如,一个沉重的不可变属性在java中我会声明为静态final,但在Kotlin中我发现很难"找到一个等价物".

static kotlin companion-object

12
推荐指数
3
解决办法
3213
查看次数

Kotlin的部分班级代表团

如何在Kotlin中部分委托方法/字段?

具体来说:这里我试图User从接口继承类TraitAmarked: Boolean在包装器中实现字段StateA.这将清理User实现,因为marked它只是一个状态字段.注意,TraitA不能是一个类,因为我想使用几个这样的接口:User() : TraitA by StateA, TraitB by StateB, ..

/* does not compile (Kotlin M12) */
interface TraitA {
    var marked: Boolean

    fun doStaffWithMarked()  // must be overridable
}

class StateA() : TraitA {
    override var marked = false
}

class User() : TraitA by StateA(){
    override fum doStaffWithMarked() {
        //...all fancy logic here...
    }
}
Run Code Online (Sandbox Code Playgroud)

另一种方法是在一个地方实现所有:

class User() : TraitA{
    override var …
Run Code Online (Sandbox Code Playgroud)

delegation multiple-inheritance kotlin

9
推荐指数
1
解决办法
3185
查看次数

在Kotlin中调用另一个默认构造函数

在Kotlin中,当一个类有多个构造函数时,我们如何在另一个构造函数中调用指定的(来自iOS世界,我找不到更好的名称)构造函数.

让我举个例子

final class LoadingButton: LinearLayout {
    var text:String? = null

    constructor(context: Context, text: String) : this(context) {
        this.text = text
    }
    constructor(context: Context) : super(context) {
        val t = this.text
        this.view {
            button(t) { /* ... */}
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这里,如果我这样做loadingButton("TEST", {}),那个字符串不会传播到按钮,因为this(context)方便构造函数中的代码之前调用(再次抱歉:).

可以在Kotlin解决吗?就像是

constructor(context: Context, text: String) {
    this.text = text
    this(context) 
}
Run Code Online (Sandbox Code Playgroud)

编辑

只是为了澄清这个想法,因为它被问到,想法是在一个活动中写这样的东西:

onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    verticalLayout {
        loadingButton("Some text")
        //or
        loadingButton() { this.text = "Some text"}
} …
Run Code Online (Sandbox Code Playgroud)

kotlin anko

9
推荐指数
1
解决办法
5535
查看次数

在 CMake 中包含库的标头

我的项目中有两个实用程序库。我正在寻找为库编写 CMake 配置的最佳方法。

/my_project
 --> CMakeLists.txt
 --> main.cpp
 --> /utils
      --> CMakeLists.txt
      --> common.h
      --> /base_c
           --> CMakeLists.txt
           --> base_c.c
           --> base_c.h
      --> /base_cpp
           --> CMakeLists.txt
           --> base_cpp.cpp
           --> base_cpp.hpp
Run Code Online (Sandbox Code Playgroud)

我当前的 CMake 文件:

/my_project/CMakeLists.txt

cmake_minimum_requared(VERSION 3.8)
project(my_project)

add_subdirectory(utils)

add_executable(main main.c)
target_link_libraries(main utils base_c base_cpp)
Run Code Online (Sandbox Code Playgroud)

/my_project/utils/CMakeLists.txt

add_subdirectory(base_c)
add_subdirectory(base_cpp)

add_library(utils)
target_sources(utils PUBLIC common.h)
Run Code Online (Sandbox Code Playgroud)

/my_project/utils/base_c/CMakeLists.txt

add_library(base_c base_c.c)
target_sources(base_c PUBLIC base_c.h)
Run Code Online (Sandbox Code Playgroud)

/my_project/utils/base_cpp/CMakeLists.txt

add_library(base_cpp base_cpp.cpp)
target_sources(base_cpp PUBLIC base_cpp.hpp)

find_library(BASEC base_c ../base_c)
target_link_libraries(base_cpp BASEC)
Run Code Online (Sandbox Code Playgroud)

问题是base_cpp没有找到包含来自base_c. 我应该如何修复配置?

我设法让它与 一起工作target_include_directories(base_cpp PRIVATE ../base_c),但根据 …

c++ cmake

8
推荐指数
1
解决办法
2万
查看次数

Kotlin:覆盖子类型中的泛型属性

我试图编写一些通用代码,但无法摆脱Type of 'PROPERTY' is not a subtype of the overridden property错误.

我的代码的简化版本:

abstract class BaseP<V> {
    var view: V? = null
}

abstract class BaseF {
    fun smth() {
        pp.view = this
    }
    abstract val pp: BaseP<BaseF>
}

abstract class SubF: BaseF() {
    abstract override val pp: BaseP<SubF>
    // Error:(20, 30) Type of 'pp' is not a subtype of the overridden property 'public abstract val pp: BaseP<BaseF> defined in BaseF'
}
Run Code Online (Sandbox Code Playgroud)

我发现错误可以 - @Suppress但我怀疑它是最好的也是唯一的方法.还有更好的东西吗?

毕竟我无法理解,为什么subtypeA<subtypeB>不算作子类型 …

generics overriding kotlin

7
推荐指数
1
解决办法
1843
查看次数

Kotlin - 列表过滤列表

我有这些数据类:

data class RouteType(

            @SerializedName("type")
            val type: String,

            @SerializedName("items")
            val items: List<RouteItem>)


data class RouteItem(

            @SerializedName("id")
            val id: String,

            @SerializedName("route")
            private val route: List<DoubleArray>)
Run Code Online (Sandbox Code Playgroud)

我想按类型过滤RouteType列表,并按ID过滤RouteItem列表.

我的代码现在:

// val filter: HashMap<String, List<String>>

val result = routeTypes  // List<RouteType>
                .filter { it.type in filter.keys }
                .map {
                    routeType -> routeType.items.filter { it.id in filter[routeType.type]!! }
                }
Run Code Online (Sandbox Code Playgroud)

如何.map使用过滤列表制作返回列表?或许还有另一种方式?

编辑

谢谢,但flatmap不完全是我需要的,我想.flatmap返回嵌套列表(List<RouteItem>),但我想要List<RouteType>.

我通过这段代码得到了它:

val result = routeTypes
                .filter { it.type in filter.keys }
                .map { …
Run Code Online (Sandbox Code Playgroud)

lambda list kotlin kotlin-android-extensions

7
推荐指数
1
解决办法
2万
查看次数

将JCenter添加到Intellij IDEA中

我需要将https://jcenter.bintray.com/添加到IntelliJ IDEA中.IJ应该能够像在Maven Central中那样从JCenter中查找和更新软件包.

目前,当我将URL添加到maven repos列表时,它会抱怨"找不到存储库".

设置屏幕截图

注意:我使用内部IJ构建系统,那里没有Maven或Gradle(我有理由不使用它们)

intellij-idea maven jcenter

6
推荐指数
1
解决办法
1482
查看次数

Kotlin NDArray具有带通用返回类型的lambda构造函数

我正在尝试在Kotlin中创建一个非常简单的通用NDArray类,该类将lambda表达式用作初始化函数。

class NDArray<T>(i: Int, j: Int, f: (Int) -> T) {
    val values: Array<T> =  Array(i * j, f)
}
Run Code Online (Sandbox Code Playgroud)

典型的用法是:

fun main(args: Array<String>){
    val m = NDArray(4, 4, ::zero)
}

fun zero(i: Int) =  0.0
Run Code Online (Sandbox Code Playgroud)

我的问题是Kotlin编译器抱怨构造函数中的值初始化

values = Array(i * j, f)
Run Code Online (Sandbox Code Playgroud)

通过说“不能使用'T'作为化类型参数。改为使用类”。为什么呢

编辑:

如果我改为用自己的MyArray代替Kotlin Array实现,则会编译:

class NDArray<T>(i: Int, j: Int, f: (Int) -> T) {
    val values: MyArray<T> =  MyArray(i * j, f)
}

class MyArray<T>(i:Int, init: (Int) -> T) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

不确定当Kotlin具有相同的构造函数时,为什么Kotlin将MyArray与常规Array区别对待吗?

arrays generics type-erasure kotlin

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