2016-01-21 94 views
6

我想知道有没有办法简化下面的代码?我正在尝试使用EBean从数据库中获取某些内容。如果有东西,则将其映射到对象或以其他方式返回默认实现实例。Java8可选功能链表达

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

我认为你可以将条目映射到新创建的对象,否则返回en空元素。 – nolexa

+0

定义简化 –

+0

@MisrableVariable更容易理解,可以做就像一个链式时尚? – peter

回答

10

你可以使用lambda,而不是一个匿名类 - 并使用地图来获取默认值所需的结果+否则容易:

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"))); 
} 
+0

和最后一行(返回)看起来是一样的吗? – peter

+1

是的,一个函数是一个函数...但是你可以直接跳过这个函数并且直接调用'Optional.of(Ebean.createSqlQuery(“select * from table1”)。findUnique())上的map。 – assylias

+0

因此地图可以像orElse中的“If”一样使用? – peter