如何用Optionals(函数式编程)替换我的旧Java代码?

如何用Optionals(函数式编程)替换我的旧Java代码?,java,functional-interface,Java,Functional Interface,如何使用Java 8 Optionals(函数式编程)替换以下代码 编辑: 也许如果我将findByA和findByB设置为可选,那么使用函数式编程将使我的代码更干净?这将起作用 ClassA classA = dbService.findByA(a); if (classA == null) { classA = dbService.findByB(b); } if (classA == null) { throw new Exception(); } return cl

如何使用Java 8 Optionals(函数式编程)替换以下代码

编辑: 也许如果我将
findByA
findByB
设置为可选,那么使用函数式编程将使我的代码更干净?

这将起作用

ClassA classA = dbService.findByA(a);

if (classA == null) {
    classA = dbService.findByB(b);
}

if (classA == null) {
    throw new Exception();
}

return classA;
Optional.ofNullable(
    Optional.ofNullable(dbService.findByA(a))
            .orElseGet(() -> dbService.findByB(b))
).orElseThrow(Exception::new);
我觉得这没什么好的

return Optional.ofNullable(Optional.ofNullable(dbService.findByA(a))
    .orElseGet(() -> dbService.findByB(b)))
    .orElseThrow(() -> new Exception());
或者,Java 9,更好一点:

Optional.ofNullable(dbService.findByA(a))
    .or(() -> Optional.ofNullable(dbService.findByB(b)))
    .orElseThrow(() -> new Exception());

首先,使您的方法
dbService.findByA
dbService.findByB
返回
可选。这是基础。如果不这样做,就不会进行“函数式”编程

其次,使用Java9+(或者更好的,最新版本)

然后简单地使用以下命令:

ClassA instance = dbService.findByA(a)
    .or(() -> dbService.findByB(b))
    .orElseThrow(Exception::new);
ClassA instance = Optional.of(() -> dbService.findByA(a)) // Optional<Optional<ClassA>>
    .orElseGet(() -> dbService.findByB(b)) // Optional<ClassA>
    .orElseThrow(Exception::new);
如果坚持使用Java 8,请执行以下操作:

ClassA instance = dbService.findByA(a)
    .or(() -> dbService.findByB(b))
    .orElseThrow(Exception::new);
ClassA instance = Optional.of(() -> dbService.findByA(a)) // Optional<Optional<ClassA>>
    .orElseGet(() -> dbService.findByB(b)) // Optional<ClassA>
    .orElseThrow(Exception::new);
ClassA instance=Optional.of(()->dbService.findByA(a))//可选
.orElseGet(()->dbService.findByB(b))//可选
.orelsetrow(异常::新建);

功能接口是只包含一个抽象方法的接口。你需要使用函数接口实现什么?我想你想要一个使用函数编程范例的解决方案。是的,也许我不清楚。我想用Optionals(函数编程)实现它。让findByA返回一个可选的。如果你不能做到这一点,那就不要碰代码中的任何东西。可选并不意味着替换空检查。抛出异常不是一种功能性风格/编程
。或者(()->dbService.findByB(b))
不起作用,因为
dbService.findByB(b)
不会返回一个
可选的
。我可以让它们返回可选的,但我不能使用Java 9+,你能帮助我如何用Java 8编写它吗?@0seNse0我更新了我的答案。这很难看,和其他答案很相似。这就是我强烈建议升级到Java9或更高版本的原因。Java8已经有5.5年的历史了(不再受到商业支持)。太多了!你真的应该有一个升级计划。@OlivierGrégoire Java 9/10不能下载,只有Java 11支持,Java 8支持@user7294900 My bad。我基于维基百科的文章,这篇文章显然不是最新的。不管怎样,在Java8不再受支持的情况下,跟上正在进行的开发并使用更高版本是很好的。