当你需要在结果上调用方法时如何使用orElse?

时间:2016-04-19 15:05:11

标签: java java-stream optional

我有以下代码打击。我试图找到一种方法来避开if (something.isPresent())行并声明Optional<Something> something。相反,我想链接Optional.orElse()方法并直接返回结果。但是我似乎无法找到一种方法,因为如果找不到该元素,该方法需要返回null,如果找到它,则需要在返回之前调用其上的方法。

有更好的方法吗?

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

public class OrElseWhat {

    private class Something {
        private String it;
        Something(String it) { this.it = it; }
        String getIt() { return it; }
    }

    private List<Something> somethings = new ArrayList<Something>() {
        {
            add(new Something("one"));
            add(new Something("two"));
            add(new Something("three"));
        }
    };

    public String getFourOrNull() {
        Optional<Something> something = somethings.stream()
                .filter(s -> s.getIt().equals("four"))
                .findAny();

        if (something.isPresent()) {
            return something.get().getIt();
        }

        return null;
    }
}

2 个答案:

答案 0 :(得分:3)

您可以使用Optionalmap表单中使用public String getFourOrNull() { return somethings.stream() .filter(s -> s.getIt().equals("four")) .findAny() .map(Something::getIt) .orElse(null); } 时调用该方法:

maps

来自orElse&#39; s documentation

  

如果存在值,则将提供的映射函数应用于该值,如果结果为非null,则返回描述结果的Optional。否则返回一个空的Optional。

尽管如此,如果可以,请听@Aaron并放弃getFourOrNull,以便Optional返回null。任何方法都不应该在使用Optional的代码库中返回return super.onCreateOptionsMenu(menu);

答案 1 :(得分:2)

我认为您应该将方法的签名更改为Optional<String>并始终返回something

Optional是针对这种情况制作的:它们可以避免返回一些非特定值(可能是null?或""?或{ {1}})并且相当清楚地描述从你的签名开始,也许你能够返回某种类型,但并非总是如此。