我有以下代码:
final var fieldValuesStream = items.stream()
.map(person -> PersonFieldGetter.getFieldValueAsNumber(functionsParameters.getFieldName(), person)) // Number
.mapToDouble(number -> number.doubleValue());
Run Code Online (Sandbox Code Playgroud)
IDEA 突出显示“number -> number.doubleValue()”并显示以下消息:
Lambda 可以替换为方法引用
将 Lambda 替换为方法引用
但是当我将代码更改为.mapToDouble(Number::doubleValue)编译错误时发生:
QueryProcessor.java:31:34 java: 不兼容的类型:类 java.lang.Number 中的无效方法引用方法 doubleValue 无法应用于所需的给定类型:未找到参数:java.lang.Object 原因:实际参数列表和形式参数列表不同长度
完整源代码
为什么会发生这种情况?
编辑:添加了 GitHub 项目的链接,其中包含无法使用以下命令构建的示例项目:
IntelliJ IDEA 2021.2.3 (Ultimate Edition)
Build #IU-212.5457.46,构建于 2021 年 10 月 12 日
运行时版本:11.0.12+7-b1504.40 amd64
VM:OpenJDK 64 位服务器 VM by JetBrains sro
SDK:Oracle OpenJDK 17.0.1
import java.util.List;
public class Main {
public static void main(String[] args) {
List.of(0.1d).stream().map(aDouble -> {
return List.of(1).stream().map(p -> aDouble).mapToDouble(Number::doubleValue);
}
);
}
}
Run Code Online (Sandbox Code Playgroud)
aDouble似乎问题是编译器无法识别嵌套流中的类型并导致一些奇怪的错误。
Stream.of(0.1d).map(aDouble ->
List.of(1).stream().map(p -> aDouble).mapToDouble(Double::doubleValue)
);
Run Code Online (Sandbox Code Playgroud)
aDouble Stream.of(0.1d).map((Double aDouble) -> {
return List.of(1).stream().map(p -> aDouble).mapToDouble(Double::doubleValue);
}
);
Run Code Online (Sandbox Code Playgroud)
Stream.of(0.1d).map(aDouble -> {
return List.of(1).stream().map(p -> aDouble).mapToDouble(d -> d.doubleValue());
}
);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
366 次 |
| 最近记录: |