Kotlin类属性的延迟初始化将不会编译
我不完全确定,我认为这是真正的问题。 但我想使用lazy
作为委托,我收到编译器错误
data class Geocode(var latitude: Double, var longitude: Double) : Comparable<Geocode> { override fun compareTo(other: Geocode): Int { var result = this.latitude.compareTo(other.latitude) if (result == 0) result = this.longitude.compareTo(other.longitude) return result } } data class HubKt(val position:Geocode) { } data class Example(val hubs:Collection<HubKt>) { val bounds:Any by lazy { object { val ne: this.hubs.map { h -> h.position }.max() val sw: this.hubs.map { h -> h.position }.min() } } }
如果这是java,我会想bounds
函数返回一个地图:
public Map<String,Geocode> getBounds() { Geocode ne = geos.stream().max(Geocode::compareTo).get(); Geocode sw = geos.stream().min(Geocode::compareTo).get(); return ImmutableMap.of("ne",ne,"sw",sw); }
我认为这个问题不是用正确的。 我尝试this@Authenticate
,这是一个不行。 地狱,我甚至可能会过度复杂化。 感谢您的洞察力。
根据问题中的当前代码:
data class Bounds(val ne: Geocode, val sw: Geocode) data class Example(val hubs:Collection<HubKt>) { val bounds: Bounds by lazy { Bounds(hubs.map { it.position }.max()!!, hubs.map { it.position }.min()!!) } }
否则,在你的答案中,你将无法访问你通过对象表达式创建的Any
的匿名后代中的ne
和sw
。 你需要一个类型化的响应,如Bounds
类或Map
(这将是icky)。 而且在你的版本中,他们可能是空的。 如果你知道你在列表中至少有一个值,你可以使用!!
断言你知道max
或min
的结果不会为空。
您可以在没有地图创建的副本的情况下进行此更改:
data class Example(val hubs:Collection<HubKt>) { val bounds: Bounds by lazy { Bounds(hubs.maxBy { it.position }!!.position, hubs.minBy { it.position }!!.position) } }
或者,如果你想要空值作为可能的边界使用?.
安全的运营商而不是!!.
并更改Bounds
类以允许null
:
data class Bounds(val ne: Geocode?, val sw: Geocode?) data class Example(val hubs:Collection<HubKt>) { val bounds by lazy { Bounds(hubs.maxBy { it.position }?.position, hubs.minBy { it.position }?.position) } }
注意在最后一个例子中,我从val bounds: Bounds
删除了这个类型,因为它是可选的,并且类型推断可以很好地解决这个问题。
好的,我解决了这个问题:2倍
语法错误为“未知符号”? 我需要=
而不是:
(DOH!)
val bounds:Any by lazy { object { val ne = hubs.map { h -> h.position }.max() val sw = hubs.map { h -> h.position }.min() } }
龙目岛(Lombok):在Hub
position
有龙目岛(Lombok)产生的吸气:
@Getter @Setter private Geocode position = new Geocode(50.0,50.0);
改成:
@Setter private Geocode position = new Geocode(50.0,50.0); public Geocode getPosition() { return position; }
最终这是一个整合问题。 叹