我有一个基于GUI的应用程序(Kotlin),它由左边的Note列表(显示注释的标题)和右边选定的Note版本屏幕组成。 当用户在编辑屏幕上修改标题时,列表项必须显示新的标题。 在一个可变的世界里,我会做这样的事情: interface Note { fun title(): String fun content(): String fun setTitle(newTitle: String) fun setContent(newTitle: String) fun addListener(l: Listener) } class NoteListItem(n: Note) : Listener { init { n.addListener(this) } override fun onChange() { //from Listener repaint(); } fun repaint() { //code } } class NoteEditionScreen(n: Note) { fun onTitleTextChanged(newTitle: String) { n.setTitle(newTitle) […]
我试图用多个构造函数实现一个不可变的数据类。 我觉得这样的事情应该是可能的: data class Color(val r: Int, val g: Int, val b: Int) { constructor(hex: String) { assert(Regex("#[a-fA-F0-6]{6}").matches(hex), { "$hex is not a hex color" } ) val r = hex.substring(1..2).toInt(16) val g = hex.substring(3..4).toInt(16) val b = hex.substring(5..6).toInt(16) this(r,g,b) } } 当然,事实并非如此:Kotlin预计主要构造函数的调用将在顶部声明: constructor(hex: String): this(r,g,b) { assert(Regex("#[a-fA-F0-6]{6}").matches(hex), { "$hex is not a hex color" […]
目前,我正在通过Java API读取文件,并通过foreach方法将项目添加到地图,这迫使我使用mutablemap。 有没有收集项目没有mutablemap的方式? 我知道有一个方法收集,但我无法得到它的工作。 目前的方式: val result = mutableMapOf<Int, MutableMap<Int, Double>>() Files.lines(Paths.get(folderPath)) .map { line -> line.split(",") } .map { items -> Triple(items[0].toInt(), items[1].toInt(), items[2].toDouble()) } .forEach { (id, article, rating) -> if (result.containsKey(id)) result[id]!!.put(article, rating) else result.put(id, mutableMapOf(Pair(article, rating))) } 编辑: 我的目标是基于三元组的第一个值合并三元对象。 所以情景会是两个三重对象(1,2,5.5)和(1,3,5.5)。 三元组的第一个值是用户ID,第二个是文章ID,第三个是文章的评分。 在合并之后,在地图上将会有一个单独的条目,其中包含第一个键=用户ID,三元组的第一个值,并且该值将是包含用户评分的文章的地图。 目前我正在努力工作,但是我很好奇是否有解决这个问题的更有效的方法。
我已经在Kotlin中声明了一个String变量。 var str: String Kotlin文件与可变性概念相矛盾。 按照文档… var是可变的。 但是对于字符串,它定义为不可变的。 所以请澄清矛盾
java.util.Date本身是一个可变对象。 因此,即使Kotlin数据类(日期字段声明为val)阻止我更改引用,我可以修改日期对象本身以更改其值。 我可以想出的方法: 使用普通类,重写getter和setter。 在每个使用克隆方法来复制给定的日期。 @Column(name = "db_date") private var dbDate: Date? = null get() = dbDate?.clone() as Date set(date) { field = date?.clone() as Date } 此外,我不能使用数据类的copy方法,因为这些类是休眠实体。 所以我需要通过setter修改它们。 我想为我的实体使用数据类的原因是因为这些默认实现equals和hashcode 。 我们一直在使用Java的龙目岛这个,现在令人信服的团队创造这些方法是艰难的。 即使通过IDE发生,它仍然会被检查到源代码管理。 那么有什么办法可以做数据类逻辑的自定义设置器。 或者任何我可以生成等于和正常类的哈希码,而无需在源代码管理中检查它们? 编辑:在注释中指出使用java.time.Instant是不可变的。 我面临的问题是这是一个Hibernate实体类 ,我们正在使用休眠3.6 。 即时支持来到休眠5.2,所以我们是后面的方式,迁移休眠将是一个沉重的任务。 我注意到的是,kotlin数据类允许setter和getter只是以不同的方式。 代码如下: @Entity @Table(name = "my_table") data class MyTable( @Id @Column(name = "id") var id: […]
我想在Kotlin中使用像Clojure所使用的不可变持久集合。 我可以使用哪些库(在JVM和Javascript中)? 他们如何与Kotlin整合?
我已经开始使用Kotlin作为java的替代品,并且非常喜欢它。 但是,我一直无法找到一个解决方案,而不跳回到java土地: 我有一个Iterable<SomeObject> ,需要将其转换为一个列表,所以我可以遍历它不止一次。 这是一个不可变列表的明显应用,因为我需要做的就是多次读取它。 我怎么实际上把这些数据放在列表中呢? (我知道这是一个接口,但我一直无法在文档中找到它的实现) 可能(如果不满意)解决方案: val valueList = arrayListOf(values) // iterate through valuelist 要么 fun copyIterableToList(values: Iterable<SomeObject>) : List<SomeObject> { var outList = ArrayList<SomeObject>() for (value in values) { outList.add(value) } return outList } 除非我误解,否则最终会出现MutableLists ,它的工作原理似乎是一种解决方法。 有没有类似immutableListOf(Iterable<SomeObject>)方法,将实例化一个不可变的列表对象?
在Kotlin中,假设我有data class A (val f: B)和data class B (val f: A) 。 我想初始化本地var a: A和var b: B ,使得af是b , bf是a 。 Af和Bf必须保持vals。 这个圆形实例化可能吗? data class A(val f: B) data class B(val f: A) fun foo() { var a: A var b: B // instantiate a and b here with af == b and bf == […]
我有一个Java / Kotlin互操作问题。 一个Kotlin不可变列表被编译成一个可变的正常的java.util.ArrayList! Kotlin(图书馆): class A { val items: List<Item> = ArrayList() } Java(消费者): A a = new A(); a.getItems().add(new Item()); // Compiles and runs but I wish to fail or throw 如何使我的Kotlin类从Java的角度来看完全不可变?
我遵循Kotlin方法 fun getpower(base:Int,power:Int):Int { var result = 1 while(power > 0){ result = result * base power– // <—- error in this line } return result } Kotlin编译器提供以下错误Error:(6, 8) Val cannot be reassigned 更新变量有什么问题?