2016-01-21 22 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