pet*_*ter 7 java lambda functional-programming optional java-8
我想知道有没有办法简化以下代码?我试图通过使用EBean从数据库中获取一些东西.如果有什么东西然后将其映射到对象或以其他方式返回默认实现实例.
public static ObjectA test1() {
Function<Optional<SqlRow>, ObjectA> sqlRowToObjectA= new Function<Optional<SqlRow>, ObjectA>() {
@Override
public AccountSummary apply(Optional<SqlRow> entry) {
return entry.isPresent() ? new ObjectA(entry.get().getInt("id"), entry.get().getString("name"))
: ObjectA.EMPTY;
}
};
return sqlRowToObjectA.apply(Optional.of(Ebean.createSqlQuery("select * from table1").findUnique()));
}
Run Code Online (Sandbox Code Playgroud)
ass*_*ias 10
您可以使用lambda而不是匿名类 - 并使用map获取所需的结果+ orElse作为默认值:
Function<Optional<SqlRow>, ObjectA> sqlRowToObjectA =
entry -> entry.map(e -> new ObjectA(e.getInt("id"), e.getString("name")))
.orElse(ObjectA.EMPTY);
Run Code Online (Sandbox Code Playgroud)
但是,在您的示例中,您根本不需要a Function并且可以重写整个方法,如下所示:
public static ObjectA test1() {
SqlRow row = Ebean.createSqlQuery("select * from table1").findUnique();
return Optional.ofNullable(row)
.map(e -> new ObjectA(e.getInt("id"), e.getString("name")))
.orElse(ObjectA.EMPTY);
}
Run Code Online (Sandbox Code Playgroud)
请注意,因为findUnique可能会返回null,您应该使用Optional.ofNullable()而不是Optional.of():如果行是,后者将抛出异常null.
最后,我想补充一点,写它会更简单,更有效:
public static ObjectA test1() {
SqlRow row = Ebean.createSqlQuery("select * from table1").findUnique();
return row == null ? ObjectA.EMPTY
: new ObjectA(row.getInt("id"), row.getString("name"));
}
Run Code Online (Sandbox Code Playgroud)
或者更改方法签名,让调用者决定在没有结果时该怎么做:
public static Optional<ObjectA> test1() {
SqlRow row = Ebean.createSqlQuery("select * from table1").findUnique();
return Optional.ofNullable(row)
.map(e -> new ObjectA(e.getInt("id"), e.getString("name")));
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
452 次 |
| 最近记录: |