以 Function<String, Object> 作为参数的 Java 8 Lambda

标签 java lambda java-8 functional-interface

Lambda Java 8 (Oracle JDK) 中有趣的编译错误

java -version
java version "1.8.0_45"
Java(TM) SE Runtime Environment (build 1.8.0_45-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)

我有一个方法调用:

new CSVFile()
.of(new FileInputStream("MyFile.csv"))
.withColumnMapping("name", "fullName", s -> s.toUpperCase())
.withColumnMapping("gender", "gender", s -> s.toUpperCase());

这是我要调用的方法:

 public CSVFile withColumnMapping(final String columnName, final String   beanPropertyName, final Function<String, Object> columnTransformFunction) {
    columnMappings.add(new ColumnMapping(columnName, beanPropertyName, Optional.of(columnTransformFunction)));
    return this;
}

我得到的编译错误是:

[ERROR] /Users/sai/fun/reactivecsv/src/test/java/reactivecsv/CSVFileTest.java:[26,50] cannot find symbol
[ERROR] symbol:   method toUpperCase()
[ERROR] location: variable s of type java.lang.Object

奇怪的是,这编译

Function<String, Object> upperCaseConversion = String::toUpperCase;
new CSVFile()
.of(new FileInputStream("MyFile.csv"))
.withColumnMapping("name", "fullName", upperCaseConversion)
.withColumnMapping("gender", "gender", upperCaseConversion);

为什么编译器无法将 lambda 合成为函数?

最佳答案

当您创建 new CSVFile() 时对于泛型,它变成了原始类型。您不得使用原始类型。将其创建为原始类型也会将其所有方法更改为原始类型,因此 withColumnMapping(String, String, Function<String, Object>)变成 withColumnMapping(String, String, Function)无法推断出您的 lambda 参数的类型。要解决您的问题,请在调用构造函数时指定正确的通用参数。

关于以 Function<String, Object> 作为参数的 Java 8 Lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31698340/

相关文章:

java - 生命周期测试中高负载下的 JVM 卡住

java - 带有 Java 8 时钟的 JUnit

java - 在线程中删除时 TransactionRequiredException

java - 使用 Jacoco 和 Circle CI 生成测试覆盖率失败

java - @Autowire字段有空指针异常['new'关键字未使用]

java - 抛出 NoSuchBeanDefinitionException

c# - 将函数分配给表达式,反之亦然

c# - Lambda 表达式对比不同的对象

python - 使用字典交叉数据框列 "contains List"

java - 如何从数组创建流?