Java Stream API:如果不为null,则为可选

时间:2017-10-13 16:38:48

标签: java java-stream optional

我想有机会在流中进行空检查:

firstItem = array.stream().min(myComparator).get();
if(firstItem!=null){
     name = firstItem.getData().get("Name")
}

是否有可能从流中获得name

3 个答案:

答案 0 :(得分:1)

请注意,Optional不能包含空值,因此您的代码将执行条件,或者在get()处发生异常而失败。

您可以将get()更改为orElse(null);但是你仍然需要单独的条件。

相反,请使用Optional.map,然后使用orElse

String name = 
    array.stream()
        .min(myComparator)
        .map(m -> m.getData().get("name"))
        .orElse(someDefaultValue);

当然,如果您不想指定默认值,则可以省略最终orElse,并将变量类型设为Optional<String>

答案 1 :(得分:1)

试试这个:

String name = array.stream().min(myComparator) //
.map(item -> item.getData().get("Name")) //
.orElse("No Name");

答案 2 :(得分:0)

不幸的是,没有办法避免某种检查或默认值(如前面的答案中已经发布的那样)。话虽如此,有一种很好的方法可以用选项进行检查。让我给你举个例子。 我已经为测试创建了简单的类。

 class ExampleData
    {
        private String name;
        private int value;

        public ExampleData(String name, int value) {
            this.name = name;
            this.value = value;
        }

        public String getName() {
            return name;
        }

        public int getValue() {
            return value;
        }

        @Override
        public String toString() {
            return "ExampleData{" +
                    "name='" + name + '\'' +
                    ", value=" + value +
                    '}';
        }
    }

现在让我们编写一个简单的测试方法。

 public void testApp()
    {
        ArrayList<ExampleData> array = new ArrayList<>(Arrays.asList(
                new ExampleData("TestName", 1),new ExampleData("TestName1", 2)));
        Optional<ExampleData> min = array
                .stream()
                .min(Comparator.comparingInt(ExampleData::getValue));

               min.ifPresent(System.out::println);



    }

请注意,我没有立即使用get()。相反,当我想提取价值时,我使用了ifPresent方法。我不知道您是否使用过C#语言,但这种方法让我想起了c#中的?运算符。

在c#中你只需要做这样的事情

String name = possibllyNullValue?.getName();

所以在Java中你可以用ifPresent()

做类似的事情

当然ifPresent返回void,因此在某些情况下会很不方便。