2016-01-21 20 views
6

Zastanawiam się, czy istnieje sposób na uproszczenie następującego kodu? Próbuję uzyskać coś z bazy danych za pomocą EBean. Jeśli coś jest, to odwzoruj je na obiekt lub w inny sposób zwróć domyślną instancję implementacji.Java8 Opcjonalne z wyrażeniem łańcuchowym funkcji

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

Myślę, że można zmapować wpis do nowo utworzonego obiektu, lub zwrócić en pusty element. – nolexa

+0

define simplify upuść –

+0

@MiserableVariable łatwiejsze do zrozumienia i może być wykonane z być może jak modę łańcuchową? – peter

Odpowiedz

10

Można użyć lambda zamiast anonimowego klasy - i korzystać z mapy, aby uzyskać pożądany efekt + OrElse dla wartości domyślnej:

Function<Optional<SqlRow>, ObjectA> sqlRowToObjectA = 
    entry -> entry.map(e -> new ObjectA(e.getInt("id"), e.getString("name"))) 
        .orElse(ObjectA.EMPTY); 

Jednak w swojej przykład nie robić potrzebuję Function w ogóle i może przepisać całą metodę tak:

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); 
} 

Zauważ, że ponieważ findUnique może powrócić null, należy użyć Optional.ofNullable() zamiast Optional.of(): ten ostatni rzuci wyjątek, jeśli wiersz jest null.


I wreszcie, chciałbym dodać, że byłoby prostsze i bardziej wydajne, aby napisać:

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

lub zmienić podpis metody i pozwolić rozmówcy zdecydować, co zrobić, jeśli nie jest wynikiem:

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

i ostatnia linia (powrót) wyglądałaby tak samo? – peter

+1

Tak, funkcja jest funkcją ... Ale można całkowicie pominąć funkcję i wywołać mapę na 'Opcjonalnie.of (Ebean.createSqlQuery (" wybierz * z tabeli1 "). FindUnique())' bezpośrednio. – assylias

+0

, więc mapa może być używana jak "If" z orElse? – peter