Java 8 Optional类介绍及其源码(6)

package optional; import java.util.Optional; public class Snippet { public static void main(String[] args) { Optional<String> test = Optional.ofNullable("abcD"); //过滤值的长度小于3的Optional对象 Optional<String> less3 = test.filter((value) -> value.length() < 3); //打印结果 System.out.println(less3.orElse("不符合条件,不打印值!")); } }

map(Function<? super T, ? extends U> mapper)方法

前面的filter方法主要用于过滤,一般不会修改Optional里面的值,map方法则一般用于修改该值,并返回修改后的Optional对象

如果入参mapper对象为null将抛NullPointerException异常,

如果Optional对象的值为null,将直接返回该Optional对象,

最后,执行传入的lambda表达式,并返回经lambda表达式操作后的Optional对象

public<U> Optional<U> map(Function<? super T, ? extends U> mapper) { Objects.requireNonNull(mapper); if (!isPresent()) return empty(); else { return Optional.ofNullable(mapper.apply(value)); } }

使用示例:

package optional; import java.util.Optional; public class Snippet { public static void main(String[] args) { Optional<String> test = Optional.ofNullable("abcD"); //将值修改为大写 Optional<String> less3 = test.map((value) -> value.toUpperCase()); //打印结果 ABCD System.out.println(less3.orElse("值为null,不打印!")); } }

flatMap(Function<? super T, Optional<U>> mapper)方法

flatMap方法与map方法基本一致,唯一的区别是,

如果使用flatMap方法,需要自己在Lambda表达式里将返回值转换成Optional对象,

而使用map方法则不需要这个步骤,因为map方法的源码里已经调用了Optional.ofNullable方法;

源码:

public<U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper) { Objects.requireNonNull(mapper); if (!isPresent()) return empty(); else { return Objects.requireNonNull(mapper.apply(value)); } }

使用示例:

package optional; import java.util.Optional; public class Snippet { public static void main(String[] args) { Optional<String> test = Optional.ofNullable("abcD"); //使用flatMap,将值修改为大写 Optional<String> less3 = test.flatMap((value) -> Optional.ofNullable(value.toUpperCase())); //使用map,将值修改为大写 //Optional<String> less3 = test.map((value) -> value.toUpperCase()); //打印结果 ABCD System.out.println(less3.orElse("值为null,不打印!")); } }

orElse(T other)方法

很简单,当值为null时返回传入的值,否则返回原值;

源码:

public T orElse(T other) { return value != null ? value : other; }

orElseGet(Supplier<? extends T> other)方法

功能与orElse(T other)类似,不过该方法可选值的获取不是通过参数直接获取,而是通过调用传入的Lambda表达式获取

源码:

public T orElseGet(Supplier<? extends T> other) { return value != null ? value : other.get(); }

使用示例:

package optional; import java.util.Optional; public class Snippet { public static void main(String[] args) { Optional<String> test = Optional.ofNullable(null); System.out.println(test.orElseGet(() -> "hello")); //将打印hello } }

orElseThrow(Supplier<? extends X> exceptionSupplier)方法

当遇到值为null时,根据传入的Lambda表达式跑出指定异常

源码

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/2872627c8a70bbbf1de4be24541a0ac7.html