Java9 - Optional类的新方法 | Java9特性

137 阅读3分钟

Java9 features - Optional Class Improvements with examples

在这篇文章中,我们将讨论添加到java9可选类中的增强功能。

什么是Java9中的可选类改进?

在java9中为现有的Optional 类增加了一些功能。java.util.Optional 有以下方法:

  1. stream()
  2. ifPresentOrElse()
  3. or()

在java9中,这些方法被添加到以下原始的可选类中

Java9可选流()方法示例

Stream(a) 该方法用于将Optional Object转换为Stream Object。

Java有一个很好的API,可以使用第8版引入的函数式编程类来操作集合数据结构。Stream() 方法被添加到Optional 类中,以便对Optional数据的API进行顺序处理。

语法

public Stream<T> stream() 

该方法返回包含一个值的流,如果该值存在,则返回一个空流。

当你用Optional 值进行迭代时,这非常有用。

让我们看看在Java 8和Java 9中把字符串列表转换为大写的例子。
例如,创建一个字符串列表,如下所示。

import java.util.*;
public class Test {
    public static void main(String[] args) {
        List<Optional<String>> listOptionalStrings = new ArrayList<>();
        listOptionalStrings.add(Optional.of("one"));
        listOptionalStrings.add(Optional.of("two"));
        listOptionalStrings.add(Optional.of("three"));
        listOptionalStrings.add(Optional.of("four"));

    }
}  

如何在Java 8中把字符串列表转换为大写字母列表

在Java8中,Optional 类有isPresentget 方法。

在列表迭代的过程中,我们要检查isPresent() 方法是否为空,并使用get() 方法检索元素,然后映射到列表。

import java.util.*;
import java.util.stream.Collectors;

public class Java8Example {
    public static void main(String[] args) {
        List<Optional<String>> listOptionalStrings = new ArrayList<>();
        listOptionalStrings.add(Optional.of("one"));
        listOptionalStrings.add(Optional.of("two"));
        listOptionalStrings.add(Optional.of("three"));
        listOptionalStrings.add(Optional.of("four"));
        // java8 example
        List<String> stringList = listOptionalStrings.stream().filter(Optional::isPresent).map(Optional::get)
                .map(String::toUpperCase).collect(Collectors.toList());
        stringList.forEach((value) -> {
            System.out.println(value);
        });
    }
}  

同样,我们也可以使用java9中的flatMap流方法来做同样的事情Java9 - 如何将字符串列表转换为大写字母列表使用
optional 流,我们将把isPresent()get()方法与Stream() 方法相结合

import java.util.*;
import java.util.stream.Collectors;

public class Java9Example {
    public static void main(String[] args) {
        List<Optional<String>> listOptionalStrings = new ArrayList<>();
        listOptionalStrings.add(Optional.of("one"));
        listOptionalStrings.add(Optional.of("two"));
        listOptionalStrings.add(Optional.of("three"));
        listOptionalStrings.add(Optional.of("four"));
        // java8 example
        List<String> stringList = listOptionalStrings.stream().flatMap(Optional::stream).map(String::toUpperCase)
                .collect(Collectors.toList());
        stringList.forEach((value) -> {
            System.out.println(value);
        });
    }
}  

以上两个例子的输出是一样的

ONE  
TWO  
THREE  
FOUR  

Java9可选的ifPresentOrElse()方法示例

Optional 引入的 ifPresentOrElse() Syntax方法检查--如果值存在,则应用带有值的动作,否则返回空动作。

void ifPresentOrElse(Consumer<? super T> action, Runnable emptyAction);  

下面是一个使用java8版本的if-else逻辑的例子

import java.util.*;

public class Test {
    public static void main(String[] args) {
        Optional<String> stringOptional = Optional.ofNullable("present");
        if (stringOptional.isPresent()) {
            System.out.println(stringOptional.get());
        } else {
            System.out.println("Default");
        }
    }
}  

isPresent() 方法来检查值是否存在,这个方法也可以用来在值呈现时执行一个消费者。

因此,对于isPresent方法,这里没有

  • 这里没有其他支持。
  • 没有对条件逻辑的else支持

在java9中,ifPresentOrElse() 方法被用来实现if和else逻辑。

import java.util.*;

public class ifPresentOrElseExample {
    public static void main(String[] args) {
        Optional<String> stringOptional = Optional.ofNullable("present");
        stringOptional.ifPresentOrElse(value -> System.out.println(value), () -> System.out.println("Default"));

    }
}  

输出

present  

Java 9的可选or()方法

Or() 方法检查,如果值是存在的,返回包含值的选项。
否则,返回Optional适用于Supplier函数。

public Optional<T> or(Supplier<? extends Optional<? extends T>> supplier)  

在java8中,OptionalorElse(),orElseGet() 方法用于在值没有出现或为空时返回默认值。

import java.util.*;

public class Test {
    public static void main(String[] args) {
        Optional<String> emptyOption = Optional.empty();
        Optional<String> strOption = Optional.of("one");
        System.out.println(emptyOption.orElse("defaultvalue")); // Outputs one
        System.out.println(strOption.orElse("defaultvalue")); // defaultvalue is returned

        System.out.println(emptyOption.orElseGet(() -> "optional null orElseGet"));
        System.out.println(strOption.orElseGet(() -> "Optional value orElseGet"));

    }
}  

输出

defaultvalue  
one  
optional null orElseGet  
one  

orElse(),orElseGet() 方法都返回值的类型,而不是Optional 对象。

我们需要有一个Optional 的内置类型,像这个方法一样返回一个Optional 对象。

or()方法提供了返回Optional 对象的实现,功能与orElse(),orElseGet() 方法相同。

import java.util.*;

public class Test {
    public static void main(String[] args) {
        Optional<String> emptyOption = Optional.empty();
        Optional<String> strOption = Optional.of("one");
        Optional<String> emptyOptionResult = emptyOption.or(() -> {
            String text = "defaultvalue";
            return Optional.ofNullable(text);
        });
        Optional<String> strOptionResult = strOption.or(() -> {
            String text = "defaultvalue";
            return Optional.ofNullable(text);
        });
        System.out.println(emptyOptionResult);
        System.out.println(strOptionResult);

    }
}  

输出

Optional[defaultvalue]  
Optional[one]  

总结

在本教程中,我们了解了java 9中的Optional类所添加的新方法。