我想知道有没有办法简化以下代码?我试图通过使用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()));
}
解决方法
您可以使用lambda而不是匿名类 – 并使用map获取所需的结果orElse作为默认值:
Function<Optional<sqlRow>,ObjectA> sqlRowToObjectA =
entry -> entry.map(e -> new ObjectA(e.getInt("id"),e.getString("name")))
.orElse(ObjectA.EMPTY);
但是,在您的示例中,您根本不需要函数,并且可以重写整个方法,如下所示:
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")));
}