Java8可选的函数链表达式

时间:2016-01-21 22:33:05

标签: java lambda functional-programming java-8 optional

我想知道有没有办法简化以下代码?我试图通过使用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()));
}

1 个答案:

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