
在这篇文章中,我们将讨论添加到java9可选类中的增强功能。
什么是Java9中的可选类改进?
在java9中为现有的Optional 类增加了一些功能。java.util.Optional 有以下方法:
- stream()
- ifPresentOrElse()
- or()
在java9中,这些方法被添加到以下原始的可选类中
- 可选Int
- [OptionalLong](/2018/08/java8-optionallong-class-example.html
- OptionalDouble。
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 类有isPresent 和get 方法。
在列表迭代的过程中,我们要检查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类所添加的新方法。