jer*_*ija 11 java lambda spring java-8
假设我想声明Spring RowMapper,但不是创建动态类,而是实现一个实现RowMapper的抽象类.这是我的方法签名:
SqlProcedure#declareRowMapper(RowMapper<?> rowMapper);
Run Code Online (Sandbox Code Playgroud)
CustomRowMapper.java:
public abstract class CustomRowMapper<T> implements RowMapper<T> {
protected A a = new A();
}
Run Code Online (Sandbox Code Playgroud)
旧的Java方式是写:
sqlProc.declareRowMapper(new CustomRowMapper<Object>() {
@Override
public Object mapRow(ResultSet rs, int rowNum) {
a.doSomething(rs, rowNum);
return new Object();
}
});
Run Code Online (Sandbox Code Playgroud)
是否有可能用lambda表达式实现相同的功能?我想做这样的事情:
sqlProc.declareRowMapper((rs, rowNum) -> {
a.doSomething(rs, rowNum);
return new Object();
});
Run Code Online (Sandbox Code Playgroud)
但后来我会得到一个编译错误说a cannot be resolved.这是因为Java将此视为该RowMapper#mapRow方法的实现,而不是CustomRowMapper#mapRow.
如何通过lambda表达式告诉Java使用CustomRowMapper而不是RowMapper?这甚至可能吗?
您可以扩展功能界面并创建自己的界面:
@FunctionalInterface
public interface CustomRowMapper<T> implements RowMapper<T> {
static A a = new A();
}
Run Code Online (Sandbox Code Playgroud)
然后,你可以传递一个lambda,这是这样的CustomRowMapper#mapRow()方法的实现:
CustomRowMapper myCustomRowMapperLambda = (rs, rowNum) -> {
a.doSomething(rs, rowNum);
return new Object();
};
sqlProc.declareRowMapper(myCustomRowMapperLambda);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9743 次 |
| 最近记录: |