相关疑难解决方法(0)

Java 8的Optional.ifPresent和if-not-Present的功能风格?

在Java 8中,我想对一个Optional对象做一些事情,如果它存在,并做另一件事,如果它不存在.

if (opt.isPresent()) {
  System.out.println("found");
} else {
  System.out.println("Not found");
}
Run Code Online (Sandbox Code Playgroud)

但这不是一种"功能风格".

Optional有一个ifPresent()方法,但我无法链接一个orElse()方法.

因此,我不能写:

opt.ifPresent( x -> System.out.println("found " + x))
   .orElse( System.out.println("NOT FOUND"));
Run Code Online (Sandbox Code Playgroud)

在回复@assylias时,我认为不适Optional.map()用于以下情况:

opt.map( o -> {
  System.out.println("while opt is present...");
  o.setProperty(xxx);
  dao.update(o);
  return null;
}).orElseGet( () -> {
  System.out.println("create new obj");
  dao.save(new obj);
  return null;
});
Run Code Online (Sandbox Code Playgroud)

在这种情况下,当opt存在时,我更新其属性并保存到数据库.当它不可用时,我创建一个新的obj并保存到数据库.

请注意我必须返回的两个lambda null.

但是当opt存在时,两个lambdas都将被执行.obj将更新,并将新对象保存到数据库.这是因为return null在第一个lambda中.并且orElseGet()将继续执行.

java functional-programming optional java-8

239
推荐指数
7
解决办法
28万
查看次数

`Optional.orElse()`和`Optional.orElseGet()`之间的区别

我试图理解Optional<T>.orElse()Optional<T>.orElseGet()方法之间的区别.

orElse()方法的描述是"如果存在则返回值,否则返回其他值".

虽然,该orElseGet()方法的描述是"如果存在返回值,否则调用other并返回该调用的结果".

orElseGet()方法采用供应商功能接口,基本上不接受任何参数和返回T.

你需要在哪种情况下使用orElseGet()?如果你有一个方法,你T myDefault()为什么不这样做optional.orElse(myDefault())而不是optional.orElseGet(() -> myDefault())

似乎没有orElseGet()将lambda表达式的执行推迟到以后的某个时间或什么的,所以有什么意义呢?(我本以为如果它返回一个更安全Optional<T>的东西会更有用,它get()永远不会抛出一个NoSuchElementException并且isPresent()总是返回真实......但显然它不是,它只是返回T就像orElse()).

我还缺少其他一些差异吗?

java optional java-8

183
推荐指数
6
解决办法
10万
查看次数

可选orElse Java中的可选项

我一直在使用Java 8中的新Optional类型,我遇到了似乎是功能上不支持的常见操作:"orElseOptional"

考虑以下模式:

Optional<Result> resultFromServiceA = serviceA(args);
if (resultFromServiceA.isPresent) return result;
else {
    Optional<Result> resultFromServiceB = serviceB(args);
    if (resultFromServiceB.isPresent) return resultFromServiceB;
    else return serviceC(args);
}
Run Code Online (Sandbox Code Playgroud)

这种模式有很多种形式,但归结为在一个可选项上需要一个"orElse",它接受一个生成一个新的可选项的函数,只有当前的一个不存在时才被调用.

它的实现看起来像这样:

public Optional<T> orElse(Supplier<Optional<? extends T>> otherSupplier) {
    return value != null ? this : other.get();
}
Run Code Online (Sandbox Code Playgroud)

我很好奇是否有这样的方法不存在的原因,如果我只是以一种无意的方式使用Optional,以及人们提出了处理这种情况的其他方式.

我应该说,我认为涉及自定义实用程序类/方法的解决方案并不优雅,因为使用我的代码的人不一定知道它们存在.

另外,如果有人知道,这样的方法是否会包含在JDK 9中,我可以在哪里提出这样的方法?对我来说,这似乎是对API的一个相当明显的遗漏.

java lambda optional java-8 java-9

128
推荐指数
5
解决办法
7万
查看次数

Java 8中的链接选项

寻找一种链接选项的方法,以便返回第一个存在的选项.如果没有,Optional.empty()则应退回.

假设我有几个像这样的方法:

Optional<String> find1()
Run Code Online (Sandbox Code Playgroud)

我想把它们链起来:

Optional<String> result = find1().orElse( this::find2 ).orElse( this::find3 );
Run Code Online (Sandbox Code Playgroud)

但当然这不起作用,因为orElse期望一个值,并orElseGet期望一个Supplier.

java lambda optional java-8

59
推荐指数
4
解决办法
3万
查看次数

标签 统计

java ×4

java-8 ×4

optional ×4

lambda ×2

functional-programming ×1

java-9 ×1