Java之optional 教程
package com.liaoxuefeng.rFunctional.cOptional;
import java.util.Optional;
/**
* @author Alex
* @since 2023/9/27 上午10:47
* <p>
* 参考教程:https://www.cnblogs.com/fuzongle/p/11871607.html
* </p>
*/
public class OptionalDemo {
/**
* 1. Optional是一个容器对象,它包括了我们需要的对象,使用Optional我们就不用显式进行空指针检查。
* 2.Optional类的Javadoc描述如下:这是一个可以为null的容器对象。如果值存在
* 则isPresent()方法会返回true,调用get()方法会返回该对象
* Optional 常用的一些方法
* 一、创建Optional对象的方法
* 1. Optional.of(T t) : 创建一个Optional实例
* 2. Optional.empty() : 创建一个空的Optional实例
* 3. Optional.ofNullable(T t) : 若t不为null,创建Optional实例,否则创建空实例
*/
public static void createObject() {
// 方式一:
Optional<Object> o1 = Optional.of("hello");
System.out.println("o1.isPresent() = " + o1.isPresent());
// 方式二:
Optional<Object> o2 = Optional.empty();
System.out.println("o2.isPresent() = " + o2.isPresent());
// 方式三:一般使用他,可以防止空指针异常
Optional<String> o3 = Optional.ofNullable("hello");
System.out.println("o1.isPresent() = " + o3.isPresent());
}
/**
* optional 容器中是否包含对象
* 1. boolean isPresent():判断是否包含对象
* 2. void ifPresent(Consumer<? super T> consumer) 如果有值,就执行Consumer接口的实现代码,并且该值会作为参数传给它。
*/
public static void isPresentMethod() {
Optional<String> o1 = Optional.ofNullable("AA");
System.out.println("o1.isPresent() = " + o1.isPresent());
o1.ifPresent(System.out::println);
}
/**
* 获取Optional容器的对象
* T get():如果调用对象包含值,返回该值,否则抛异常
* T orElse(T other):如果有值则将其返回,否则返回特定的other对象
* T orElseGet(Supplier<? extends T> other) :如果有值则将其返回,否则返回由
* Supplier接口实现提供的对象。
* T orElseThrow(Supplier<? extends X> exceptionSupplier) :如果有值则将其返
* 回,否则抛出由Supplier接口实现提供的异常。
*/
public static void getMethods() {
// get()方法
Optional<String> o1 = Optional.ofNullable("hello");
String s = o1.get();
System.out.println("s = " + s);
Boy b = new Boy();
b.setName("李将");
Optional<Girl> opt = Optional.ofNullable(b.getGirlFriend());
// 获取对象,如果没有抛出异常
// Girl girl = opt.get();
// System.out.println("girl = " + girl);
//如果获取不到就给一个默认的值
Girl girl = opt.orElse(new Girl("王娅琴"));
System.out.println("girl = " + girl);
//获取不到给一个函数返回
Girl girl2 = opt.orElseGet((() -> new Girl("王婷婷")));
System.out.println("girl2 = " + girl2);
try {
//获取不到给出一个异常
Girl girl1 = opt.orElseThrow();
System.out.println("girl1 = " + girl1);
Girl girl3 = opt.orElseThrow(NullPointerException::new);
Girl girl4 = opt.orElseThrow((() -> new RuntimeException("空指针异常!")));
} catch (NullPointerException e) {
throw new RuntimeException(e);
}
}
//map 用法
//如果有值,则对其执行调用mapping函数得到返回值。如果返回值不为null,则创建包含mapping返回值的Optional作为map方法返回值,否则返回空Optional。
public static void mapMethod() {
Optional<String> str = Optional.ofNullable("hello");
Optional<String> s = str.map(String::toUpperCase);
System.out.println("s = " + s.orElse("no value found"));
}
//flatMap 方法
//如果有值,为其执行mapping函数返回Optional类型返回值,否则返回空Optional。flatMap与map(Funtion)方法类似,区别在于flatMap中的mapper返回值必须是Optional。调用结束时,flatMap不会对结果用Optional封装。而map方法的mapping函数返回值可以是任何类型T,调用结束时,map一定会对结果用Optional封装,如果mapper返回值是Optional,那么map就会将结果封装成Optional<Optional>类型。
public static void flatMapMethod() {
Optional<String> name = Optional.ofNullable("hello");
Optional<String> s1 = name.flatMap(s -> Optional.ofNullable(s.toUpperCase()));
System.out.println("s1 = " + s1.orElse("no value found"));
}
//filter 方法
//filter方法通过传入限定条件对Optional实例的值进行过滤。如果有值并且满足断言条件返回包含该值的Optional,否则返回空Optional。
public static void filterMethod(){
Optional<String> name = Optional.ofNullable("hello");
Optional<String> s1 = name.filter(s -> s.contains("h"));
System.out.println(s1.orElse("no value found"));
Optional<String> s2 = name.filter(s -> s.length() > 8);
System.out.println(s2.orElse("str length is no 8 "));
}
public static void main(String[] args) {
//createObject();
//isPresentMethod();
//getMethods();
//mapMethod();
//flatMapMethod();
filterMethod();
}
}
本文来自博客园,作者:快乐小王子帅气哥哥,转载请注明原文链接:https://www.cnblogs.com/alex-oos/p/18552595