我不完全确定我认为实际上是什么问题。但我试图使用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
函数返回一个map:
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
。我试过this@Authenticate
,这是不行的。天哪,我甚至可能会让它复杂化。感谢您的见解。
答案 0 :(得分:3)
根据问题中的当前代码:
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()!!)
}
}
否则,在您的回答中,您无法访问通过对象表达式创建的ne
匿名后代中的sw
和Any
。您需要一个类型化的响应,例如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
中删除了类型,因为它是可选的,类型推断会很好地解决它。
答案 1 :(得分:-1)
好的,我解决了这个问题: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:position
中的Hub
让龙目岛产生了它的吸气剂:
@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;
}
最终这是一个整合问题。 叹息