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

Java 8仅当optional.ispresent时可选添加返回结果

端木飞
2023-03-14

我有一段代码,其中一个接口有一个可选的返回方法,实现它的一些类返回一些东西,其他的没有。

在努力拥抱这个辉煌的“空杀器”的过程中,下面是我尝试过的:

public interface Gun {
    public Optional<Bullet> shoot();
}

public class Pistol implements Gun{
    @Override
    public Optional<Bullet> shoot(){
        return Optional.of(this.magazine.remove(0)); 
    }//never mind the check of magazine content
}

public class Bow implements Gun{
    @Override
    public Optional<Bullet> shoot(){
        quill--;
        return Optional.empty();
    }
}

public class BallisticGelPuddy{
    private Gun[] guns = new Gun[]{new Pistol(),new Bow()};
    private List<Bullet> bullets = new ArrayList<>();
    public void collectBullets(){
        //here is the problem
        for(Gun gun : guns)
            gun.shoot.ifPresent(bullets.add( <the return I got with the method>)
}}

附注。如果(X!=null)不能做,Optional有没有真正的用处?

共有1个答案

喻嘉泽
2023-03-14

我明白你的意思了--当一个射弹(可能是一个比bullet更好的类名)穿过ballisticgelpuddy时,它要么被卡住,要么不被卡住。如果它卡住了,它就会在ballisticgelpuddy中累积。

如果我们使用null检查,让我们重写代码

for(Gun gun: guns) {
    final Bullet bullet = gun.shoot();
    if(bullet != null) {
        bullets.add(bullet);
    }
}

很直截了当吧?如果它存在,我们想把它加进去。

for(Gun gun: guns) {
    gun.shoot().ifPresent(bullets::add);
}

在这个场景中,这两种方法实际上没有区别,因为您总是要检查是否存在。optional用于防止在处理null时出错,并允许您表达更流畅的调用链,但要考虑在此场景中使用optional的实用性。对这个案子来说似乎并不完全必要。

 类似资料:
  • 我试图模拟一个对象,该对象返回一个带有Mockito的Java可选对象: 当被调用,它返回。 我希望方法返回 返回的任何原因? 方法如下: 以下是Junit:

  • 我喜欢现在Java标准库中的选项。但有一个基本问题我一直碰到,但我还没想好如何用最好的(最容易读懂、最漂亮、最短的)方法解决: 当选项为空时如何从方法返回? 如果可选项为空,我如何从方法返回,而不必在方法的其余部分中使用,也不必声明额外的变量和额外的块嵌套级别? 或者如果不可能得到所有这些,那么处理这种情况的最佳方法是什么?

  • 我想选择一组行并将它们返回给客户端,但我也想将结果集中的主键(整数id)插入到临时表中,以便在同一事务的稍后连接中使用。 这适用于同步,其中后续查询往往涉及对早期查询结果的联接。 最有效的方法是什么? 我不愿执行两次查询,尽管如果将其添加到查询缓存中可能会很快。另一种选择是将整个结果集存储到临时表中,然后从临时表中进行选择。这似乎也很浪费(我只需要临时表中的整数id。)如果有一个SELECT IN

  • 我想做这样的东西: 这将不起作用,因为ifPresent将使用者函数接口作为参数,它具有void accept(t)。它不能返回任何值。还有别的办法吗?

  • 你好,我有一个问题与elasticsearch php api,Elastica。 如果我运行这个: 我得到0个结果

  • 问题内容: 我有2张桌子- : 第二张桌子- : 我只需要选择未取消的预订(在此示例中仅为ID 3)。我可以轻松地选择带有简单条件的已取消,但由于未在此处取消工作,因此我在努力避免未取消。 问题答案: 要么: 第一个版本更直观,但是我认为第二个版本通常可以获得更好的性能(假设您在联接中使用的列上有索引)。 第二个版本有效,因为返回第一个表中所有行的一行。当条件成功,这些行会包括从第二表中的列,就像