小编hot*_*key的帖子

什么是Kotlin双爆炸(!!)操作员?

我正在用Android Studio将Java转换为Kotlin.我在实例变量后获得双重爆炸.什么是双重爆炸,更重要的是这在哪里记录?

mMap!!.addMarker(MarkerOptions().position(london).title("Marker in London"))
Run Code Online (Sandbox Code Playgroud)

kotlin kotlin-null-safety

133
推荐指数
3
解决办法
4万
查看次数

Kotlin和JPA:默认构造函数地狱

正如JPA所要求的那样,@Entity类应该有一个默认(非arg)构造函数,用于在从数据库中检索对象时实例化对象.

在Kotlin中,在主构造函数中声明属性非常方便,如下例所示:

class Person(val name: String, val age: Int) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)

但是当非arg构造函数被声明为次要构造函数时,它需要传递主构造函数的值,因此需要它们的一些有效值,如下所示:

@Entity
class Person(val name: String, val age: Int) {
    private constructor(): this("", 0)
}
Run Code Online (Sandbox Code Playgroud)

在情况下,当性能有一些更复杂的类型不只是StringInt他们是不可为空的,它看起来完全坏为他们提供价值,尤其是当有在主构造和太多的代码init块,当这些参数都在积极使用- - 当他们通过反射重新分配时,大部分代码将再次执行.

此外,val在构造函数执行后,-properties不能重新分配,因此不可变性也会丢失.

所以问题是:Kotlin代码如何适应JPA而不需要代码重复,选择"神奇"的初始值和失去不变性?

PS除了JPA之外,Hibernate是否可以构造没有默认构造函数的对象?

hibernate jpa default-constructor kotlin

113
推荐指数
6
解决办法
4万
查看次数

Kotlin的Iterable和Sequence看起来完全一样.为什么需要两种类型?

这两个接口都只定义了一种方法

public operator fun iterator(): Iterator<T>
Run Code Online (Sandbox Code Playgroud)

文档说Sequence是懒惰的.但是也不是Iterable懒惰(除非由a支持Collection)?

iterable lazy-sequences kotlin

71
推荐指数
2
解决办法
9329
查看次数

什么时候应该更喜欢Kotlin扩展功能?

在Kotlin中,具有至少一个参数的函数可以定义为常规非成员函数,也可以定义为扩展函数,其中一个参数是接收者.

对于范围界定,似乎没有区别:两者都可以在类和其他函数内部或外部声明,并且两者都可以或不可以具有相同的可见性修饰符.

语言参考似乎不建议在不同情况下使用常规函数或扩展函数.

所以,我的问题是:扩展功能何时优于常规非成员功能?当常规的扩展?

foo.bar(baz, baq)VS bar(foo, baz, baq).

它只是一个函数语义的提示(接收器肯定是焦点)或是否有使用扩展函数使代码更清洁/开辟机会的情况?

code-structure kotlin

52
推荐指数
3
解决办法
4238
查看次数

如何将Java源文件的一部分转换为Kotlin?

在我的Kotlin项目中,我有一些Java代码,我想将其转换为Kotlin.将Java文件转换为Kotlin的菜单项被禁用,因为它不是我想要转换的整个文件.

如何将Java代码转换为Kotlin?

java android kotlin

46
推荐指数
8
解决办法
6万
查看次数

等于kotlin中数据类的方法

我有以下数据类

data class PuzzleBoard(val board: IntArray) {
    val dimension by lazy { Math.sqrt(board.size.toDouble()).toInt() }
}
Run Code Online (Sandbox Code Playgroud)

我读到Kotlin中的数据类可以免费获得equals()/ hashcode()方法.

我实例化了两个对象.

val board1 = PuzzleBoard(intArrayOf(1,2,3,4,5,6,7,8,0))
val board2 = PuzzleBoard(intArrayOf(1,2,3,4,5,6,7,8,0))
Run Code Online (Sandbox Code Playgroud)

但是仍然以下语句返回false.

board1 == board2
board1.equals(board2)
Run Code Online (Sandbox Code Playgroud)

arrays equals kotlin data-class

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

Android Intent.getStringExtra()返回null

这是将字符串添加到Extras的方式:

Intent i = new Intent();
i.putExtra("Name", edt_name.getText());
i.putExtra("Description", edt_desc.getText());
i.putExtra("Priority", skb_prior.getProgress());
setResult(RESULT_OK, i);
finish();
Run Code Online (Sandbox Code Playgroud)

这是我尝试提取它们的方式onActivityResult():

String name = data.getStringExtra("Name");
String desc = data.getStringExtra("Description");
int prior   = data.getIntExtra("Priority", 50);
Run Code Online (Sandbox Code Playgroud)

但第二个代码块后namedescnull的,虽然prior有它应有的价值.此外,在调试器中,我可以看到,它data.mExtras.mMap包含所需的字符串,但仅在第一次请求之后.

string null android extras android-intent

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

kotlin数据类+ bean验证jsr 303

我试图让Kotlin在spring-data-rest项目上使用jsr 303验证.

给出以下数据类声明:

@Entity data class User(
    @Id 
    @GeneratedValue(strategy = javax.persistence.GenerationType.AUTO)
    var id: Long? = null,

    @Size(min=5, max=15)
    val name: String
)
Run Code Online (Sandbox Code Playgroud)

@Size注释在这里没有任何效果,使我能够保存名称为1个字符的用户.
它在执行相同的示例时效果很好,但在Java类而不是Kotlin中.

这让我想起了Kotlin问题.

在此先感谢您的帮助!

jpa bean-validation kotlin spring-data-rest data-class

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

Kotlin中有didSet/willSet模拟器吗?

我喜欢这个Swift语法; 它对很多东西很有帮助:

var foo: Bar = Bar() {
    willSet {
        baz.prepareToDoTheThing()
    }
    didSet {
        baz.doTheThing()
    }
}
Run Code Online (Sandbox Code Playgroud)

我很乐意在Kotlin这样做.但是,我找不到合适的语法!

Kotlin有什么相似的东西吗?

var foo: Bar = Bar()
    willSet() {
        baz.prepareToDoTheThing()
    }
    didSet() {
        baz.doTheThing()
    }
Run Code Online (Sandbox Code Playgroud)

properties kotlin didset

36
推荐指数
1
解决办法
6630
查看次数

如何使用toString扩展数据类

我创建了一个数据类

data class Something (
    val a : String,
    val b : Object,
    val c : String
)
Run Code Online (Sandbox Code Playgroud)

在我的程序中稍后我需要这个数据类的字符串表示我试图扩展toString方法.

override fun Something.toString() : String = a + b.result() + c
Run Code Online (Sandbox Code Playgroud)

这里的问题是,它不允许扩展(覆盖)toString功能,因为它不适用于顶级功能.

如何正确覆盖/扩展自定义数据类的toString方法?

kotlin kotlin-extension data-class

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