我想知道有没有办法简化以下代码?我试图通过使用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()));
}
答案 0 :(得分:10)
您可以使用lambda而不是匿名类 - 并使用map获取所需的结果+ orElse作为默认值:
Function<Optional<SqlRow>, ObjectA> sqlRowToObjectA =
entry -> entry.map(e -> new ObjectA(e.getInt("id"), e.getString("name")))
.orElse(ObjectA.EMPTY);
但是,在您的示例中,您根本不需要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);
}
请注意,由于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"));
}
或更改方法签名,让调用者决定在没有结果时该怎么做:
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")));
}