小编All*_*lan的帖子

Kotlin - 如何在映射操作后将对象列表转换为单个对象?

我正在尝试了解 Kotlin 中的映射归约操作。至少,我想这减少了我想做的事情。

假设我有一个名为Car的类,它接受任意数量的CarPart (可变参数构造函数) 。然后,我有一个CarPart列表,我将对其进行映射操作,根据操作结果,我需要使用每个子元素构建一辆 汽车,大致如下:

class CarPart(val description: String)
class Car(vararg val carPart: CarPart)

val carParts = listOf(CarPart("Engine"), CarPart("Steering Wheel")))

carParts.map { it.description.toUpperCase() }
    .map { CarPart(it) }
    .reduce { acc, carPart -> Car(carPart) }  <--- I'm struggling here, is reduce what I should be doing 
                                                   to construct one car from all the subelement?
Run Code Online (Sandbox Code Playgroud)

PS.1:我知道类设计可以更好,并且不采用可变参数,这只是我正在重构的遗留应用程序的一个示例,最初这是一个采用可变参数的 Java 类,我现在无法更改。

PS.2:映射到字符串然后从该字符串创建对象的示例只是为了示例。实际代码抓取列表中的一个对象。

reduce functional-programming mapreduce kotlin

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

为什么 Java 编译器不将这些调用内联到单个 if 子句中?

我被拉入了类似于以下代码的性能调查:

private void someMethod(String id) {
   boolean isHidden = someList.contains(id);
   boolean isDisabled = this.checkIfDisabled(id);

   if (isHidden && isDisabled) {
     // Do something here
   }
}
Run Code Online (Sandbox Code Playgroud)

当我开始调查它时,我希望编译后的版本看起来像这样:

private void someMethod(String id) {
   if (someList.contains(id) && this.checkIfDisabled(id)) {
     // Do something here
   }
}
Run Code Online (Sandbox Code Playgroud)

然而,令我惊讶的是,编译后的版本看起来和第一个版本一模一样,带有局部变量,这导致 in 中的方法isDisabled总是被调用,这就是性能问题所在。

我的解决方案是自己内联它,所以该方法现在在 处短路isHidden,但它让我想知道:为什么 Java 编译器在这种情况下不够聪明,无法为我内联这些调用?它真的需要局部变量吗?

谢谢 :)

java performance jvm bytecode javac

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