当前位置: 首页 > 知识库问答 >
问题:

Java8的optional.ifpresent和if-not-present的函数样式?

慕容雅珺
2023-03-14
if (opt.isPresent()) {
  System.out.println("found");
} else {
  System.out.println("Not found");
}

optional有一个ifPresent()方法,但我无法链接orelse()方法。

因此,我不能写:

opt.ifPresent( x -> System.out.println("found " + x))
   .orElse( System.out.println("NOT FOUND"));

在回复@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;
});

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

注意,在两个lambda中,我必须返回null

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

共有1个答案

封弘伟
2023-03-14

对我来说,@Dane White的答案是可以的,首先,我不喜欢使用runnable但是我找不到任何替代方法。

这里我更喜欢另一个实现:

public class OptionalConsumer<T> {
    private Optional<T> optional;

    private OptionalConsumer(Optional<T> optional) {
        this.optional = optional;
    }

    public static <T> OptionalConsumer<T> of(Optional<T> optional) {
        return new OptionalConsumer<>(optional);
    }

    public OptionalConsumer<T> ifPresent(Consumer<T> c) {
        optional.ifPresent(c);
        return this;
    }

    public OptionalConsumer<T> ifNotPresent(Runnable r) {
        if (!optional.isPresent()) {
            r.run();
        }
        return this;
    }
}

然后:

Optional<Any> o = Optional.of(...);
OptionalConsumer.of(o).ifPresent(s -> System.out.println("isPresent " + s))
                .ifNotPresent(() -> System.out.println("! isPresent"));
public class OptionalConsumer<T> implements Consumer<Optional<T>> {
private final Consumer<T> c;
private final Runnable r;

public OptionalConsumer(Consumer<T> c, Runnable r) {
    super();
    this.c = c;
    this.r = r;
}

public static <T> OptionalConsumer<T> of(Consumer<T> c, Runnable r) {
    return new OptionalConsumer(c, r);
}

@Override
public void accept(Optional<T> t) {
    if (t.isPresent()) {
        c.accept(t.get());
    }
    else {
        r.run();
    }
}
Consumer<Optional<Integer>> c = OptionalConsumer.of(
    System.out::println, 
    () -> System.out.println("Not fit")
);

IntStream.range(0, 100)
    .boxed()
    .map(i -> Optional.of(i)
    .filter(j -> j % 2 == 0))
    .forEach(c);

在这段新代码中,您有3件事:

  1. 可以在对象存在之前轻松定义功能。
  2. 不为每个可选对象创建对象引用,只创建一个对象引用,您的内存比GC少。
  3. 它正在实现consumer以便更好地与其他组件一起使用。

顺便说一下,现在它的名称更具有描述性它实际上是消费者的 >

 类似资料:
  • 检查变量的内容是否为数值、大写字母或其他。 if var is type if var is not type 参数 var 变量 名. type 请参阅下面的备注. 备注 受支持的 Type: integer 当 var 非空且包含不带小数点的纯数值字符串 (十进制或十六进制) 时为 true. 允许含有前导和尾随空格和 tab. 字符串可以以加号或减号开始. float 当 var 非空且包含

  • 这可能是一个非常愚蠢的问题,但Java的这句台词是什么意思呢? 我知道它与一个if函数有关,但我试图用if重写它。但我不知道它是怎么工作的。

  • 问题内容: 使用ng-if与值或函数有什么区别吗? 更新(为了更好地理解我为什么要) html js 如果我这样使用,我已经达到了$ digest()迭代 重新更新 (对于chandermani评论) 问题答案: 对于角度都是,它将在当前范围内进行评估。Angular在每个摘要周期执行此操作。 如果您使用的是功能方式,则还有更多的射击方法。可以做 在这种情况下,对每个摘要循环的绑定评估会使您的绑定

  • 主要内容:1 Java8 函数式接口的介绍,2 Java8 函数式接口的案例1,3 Java8 函数式接口的案例2,4 Java8 函数式接口的错误示范,5 Java8 函数式接口的案例3,6 Java8 预定义函数式接口1 Java8 函数式接口的介绍 完全包含一种抽象方法的接口称为函数式接口。函数式接口可以具有任意数量的默认静态方法,但只能包含一个抽象方法。函数式接口还可以声明对象类的方法。 函数式接口也称为单一抽象方法接口或SAM接口。它是Java8 中的新功能,有助于实现函数编程方法。

  • null null 用console.log在脚本中测试它,这个函数会像预期的那样解决和拒绝。 square.js 但是当我尝试运行下面的jest测试时: square.test.js 我的测试失败,出现以下错误: TypeError:calculateSquare不是函数 你能帮我理解为什么当它是“不是函数”的时候,以及写这些测试的正确方式是什么吗? 提前感谢你的帮助