首页 > 编程语言 >笔记:正确得使用java 8得optional

笔记:正确得使用java 8得optional

时间:2022-12-05 11:31:08浏览次数:37  
标签:返回 map java Optional 笔记 new return null optional


public static String getName(User u) {
if (u == null)
return "Unknown";
return u.name;
}

比如以前这样得代码,经常要判断是否NULL,很麻烦,有了java 8得optional,则变得比较简单了:
 

public static String getName(User u) {
return Optional.ofNullable(u)
.map(user->user.name)
.orElse("Unknown");
}

类方法

序号

方法 & 描述

1

static <T> Optional<T> empty()

返回空的 Optional 实例。

2

boolean equals(Object obj)

判断其他对象是否等于 Optional。

3

Optional<T> filter(Predicate<? super <T> predicate)

如果值存在,并且这个值匹配给定的 predicate,返回一个Optional用以描述这个值,否则返回一个空的Optional。

4

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

如果值存在,返回基于Optional包含的映射方法的值,否则返回一个空的Optional

5

T get()

如果在这个Optional中包含这个值,返回值,否则抛出异常:NoSuchElementException

6

int hashCode()

返回存在值的哈希码,如果值不存在 返回 0。

7

void ifPresent(Consumer<? super T> consumer)

如果值存在则使用该值调用 consumer , 否则不做任何事情。

8

boolean isPresent()

如果值存在则方法会返回true,否则返回 false。

9

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

如果有值,则对其执行调用映射函数得到返回值。如果返回值不为 null,则创建包含映射返回值的Optional作为map方法返回值,否则返回空Optional。

10

static <T> Optional<T> of(T value)

返回一个指定非null值的Optional。

11

static <T> Optional<T> ofNullable(T value)

如果为非空,返回 Optional 描述的指定值,否则返回空的 Optional。

12

T orElse(T other)

如果存在该值,返回值, 否则返回 other。

13

T orElseGet(Supplier<? extends T> other)

如果存在该值,返回值, 否则触发 other,并返回 other 调用的结果。

14

<X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier)

 

如果存在该值,返回包含的值,否则抛出由 Supplier 继承的异常

15

String toString()

返回一个Optional的非空字符串,用来调试

 

 

例子:

import java.util.Optional;

public class Java8Tester {
public static void main(String args[]){

Java8Tester java8Tester = new Java8Tester();
Integer value1 = null;
Integer value2 = new Integer(10);

// Optional.ofNullable - 允许传递为 null 参数
Optional<Integer> a = Optional.ofNullable(value1);

// Optional.of - 如果传递的参数是 null,抛出异常 NullPointerException
Optional<Integer> b = Optional.of(value2);
System.out.println(java8Tester.sum(a,b));
}

public Integer sum(Optional<Integer> a, Optional<Integer> b){

// Optional.isPresent - 判断值是否存在

System.out.println("第一个参数值存在: " + a.isPresent());
System.out.println("第二个参数值存在: " + b.isPresent());

// Optional.orElse - 如果值存在,返回它,否则返回默认值
Integer value1 = a.orElse(new Integer(0));

//Optional.get - 获取值,值需要存在
Integer value2 = b.get();
return value1 + value2;
}
}

输出:


第一个参数值存在: false 第二个参数值存在: true 10 又比如:


public static String getChampionName(Competition comp) throws IllegalArgumentException {
if (comp != null) {
CompResult result = comp.getResult();
if (result != null) {
User champion = result.getChampion();
if (champion != null) {
return champion.getName();
}
}
}
throw new IllegalArgumentException("The value of param comp isn't available.");
}

则可以写成这样:

public static String getChampionName(Competition comp) throws IllegalArgumentException {
return Optional.ofNullable(comp)
.map(c->c.getResult())
.map(r->r.getChampion())
.map(u->u.getName())
.orElseThrow(()->new IllegalArgumentException("The value of param comp isn't available."));
}

又比如,

比如为空则不打印可以这么写:

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

 

再来看个例子:

class Outer {
Nested nested;
Nested getNested() {
return nested;
}
}
class Nested {
Inner inner;
Inner getInner() {
return inner;
}
}
class Inner {
String foo;
String getFoo() {
return foo;
}
}

改写为:

Optional.of(new Outer())
.map(Outer::getNested)
.map(Nested::getInner)
.map(Inner::getFoo)
.ifPresent(System.out::println);

还有一种实现相同作用的方式就是通过利用一个 supplier 函数来解决嵌套路径的问题:

Outer obj = new Outer();
resolve(() -> obj.getNested().getInner().getFoo());
.ifPresent(System.out::println);

调用 obj.getNested().getInner().getFoo()) 可能会抛出一个 NullPointerException 异常。在这种情况下,该异常将会被捕获,而该方法会返回 Optional.empty()。

public static <T> Optional<T> resolve(Supplier<T> resolver) {
try {
T result = resolver.get();
return Optional.ofNullable(result);
}
catch (NullPointerException e) {
return Optional.empty();
}
}

标签:返回,map,java,Optional,笔记,new,return,null,optional
From: https://blog.51cto.com/u_14230175/5911682

相关文章

  • 《重构》、《js高级程序设计》一些笔记知识点
    《重构(第2版):改善既有代码的设计》1.函数命名:以它“做什么”来命名,而不是以它“怎么做”来命名。 一个改进函数名字的好方法:先写一句注释描述这个函数的用途,再把这......
  • JDK的dt.jar和Java BeanInfo接口
    在JAVA_HOME/lib下面有两个比较重要的jar文件,tools.jar和dt.jar。 tools.jar在上篇文章中做了简单的介绍。这里来介绍下dt.jar。在Oracle官方网站搜dt.jar,找到JDKand......
  • (笔记)JMH基准测试,不错的JAVA基准测试工具
    测试JAVA中的方法的执行性能,比较稳妥合理的方法,是用JMH(​​https://openjdk.java.net/projects/code-tools/jmh/​​)这个JAVA的测试工具。1)MAVEN加入库: <properties>......
  • 快速比较JAVA中两个集合是否相等
    有几个方法:1)如果是不在乎顺序,只要内容相同就可以认为相等,则:public<TextendsComparable<T>>booleanisEquals(List<T>list1,List<T>list2){if(list1==nul......
  • TS学习笔记
    ###1.类型系统####数字类型声明:lete:number;####字符串类型声明:lete:string;####布尔类型声明:lete:boolean=true;//也可以声明完直接进行赋值,如果......
  • Java同步器之ReentrantLock源码分析(一)
    一、概述ReentrantLock是Java并发包中提供的一个可重入的互斥锁。ReentrantLock和synchronized在基本用法,行为语义上都是类似的,同样都具有可重入性。只不过相比原生的Sync......
  • 两道面试题,带你解析Java类加载机制
    在许多Java面试中,我们经常会看到关于Java类加载机制的考察,例如下面这道题:classGrandpa{static{System.out.println("爷爷在静态代码块");}}classFatherextendsGra......
  • JAVA 解压缩代码写法
    packagecom.chinaunicom.asset.common.utils.compress;importlombok.extern.slf4j.Slf4j;importorg.apache.commons.compress.archivers.ArchiveEntry;importorg.......
  • Java8新特性之方法引用
    1.1基本概念方法引用主要指通过方法的名字来指向一个方法而不需要为方法引用提供方法体,该方法的调用交给函数式接口执行。方法引用是在特定场景下lambda表达式的一种......
  • JavaScript入门⑤-欲罢不能的对象原型与继承-全网一般图文版
    JavaScript入门系列目录JavaScript入门①-基础知识筑基JavaScript入门②-函数(1)基础{浅出}JavaScript入门③-函数(2)原理{深入}执行上下文JavaScript入门④-万物皆......