无涯教程-Java8 - Optional类

65 阅读2分钟

Optional 类是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。

Optional 类的引入很好的解决空指针异常。

以下是java.util.Optional类的声明

public final class Optional<T> extends Object

Optional方法

Sr.No. Method & Remark
1

static Optional empty()

返回空的 Optional 实例。

2

boolean equals(Object Obj)

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

3

Optional filter(Predicate predicate)

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

4

Optional flatMap(Function> mapper)

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

5

T get()

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

6

int hashCode()

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

7

void ifPresent(Consumer consumer)

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

8

boolean isPresent()

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

9

Optional map(Function mapper)

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

10

static Optional of(T value)

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

11

static Optional ofNullable(T value)

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

12

T orElse(T Other)

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

13

T orElseGet(Supplier other)

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

14

T orElseThrow(Supplier exceptionSupplier)

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

15

string toString()

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

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);

  </span><span class="com">//Optional.ofNullable - 允许传递参数为null。</span><span class="pln">
  </span><span class="typ">Optional</span><span class="pun">&lt;</span><span class="typ">Integer</span><span class="pun">&gt;</span><span class="pln"> a </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Optional</span><span class="pun">.</span><span class="pln">ofNullable</span><span class="pun">(</span><span class="pln">value1</span><span class="pun">);</span><span class="pln">
	
  </span><span class="com">//Optional.of - 如果传递的参数为null,则抛出nullpointerexception</span><span class="pln">
  </span><span class="typ">Optional</span><span class="pun">&lt;</span><span class="typ">Integer</span><span class="pun">&gt;</span><span class="pln"> b </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Optional</span><span class="pun">.</span><span class="kwd">of</span><span class="pun">(</span><span class="pln">value2</span><span class="pun">);</span><span class="pln">
  </span><span class="typ">System</span><span class="pun">.</span><span class="kwd">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="pln">java8Tester</span><span class="pun">.</span><span class="pln">sum</span><span class="pun">(</span><span class="pln">a</span><span class="pun">,</span><span class="pln">b</span><span class="pun">));</span><span class="pln">

}

public Integer sum(Optional<Integer> a, Optional<Integer> b) { //Optional.isPresent - 检查值是否存在

  </span><span class="typ">System</span><span class="pun">.</span><span class="kwd">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="str">"First parameter is present: "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> a</span><span class="pun">.</span><span class="pln">isPresent</span><span class="pun">());</span><span class="pln">
  </span><span class="typ">System</span><span class="pun">.</span><span class="kwd">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="str">"Second parameter is present: "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> b</span><span class="pun">.</span><span class="pln">isPresent</span><span class="pun">());</span><span class="pln">
	
  </span><span class="com">//Optional.orElse - 如果出现否则返回,则返回值</span><span class="pln">
  </span><span class="com">//默认值传递。</span><span class="pln">
  </span><span class="typ">Integer</span><span class="pln"> value1 </span><span class="pun">=</span><span class="pln"> a</span><span class="pun">.</span><span class="pln">orElse</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Integer</span><span class="pun">(</span><span class="lit">0</span><span class="pun">));</span><span class="pln">
	
  </span><span class="com">//Optional.get - 获取值,值应该存在</span><span class="pln">
  </span><span class="typ">Integer</span><span class="pln"> value2 </span><span class="pun">=</span><span class="pln"> b</span><span class="pun">.</span><span class="kwd">get</span><span class="pun">();</span><span class="pln">
  </span><span class="kwd">return</span><span class="pln"> value1 </span><span class="pun">+</span><span class="pln"> value2</span><span class="pun">;</span><span class="pln">

} }

使用javac编译器编译类,如下所示-

C:\JAVA>javac Java8Tester.java

现在运行Java8Tester,如下所示-

C:\JAVA>java Java8Tester

它应该生成以下输出-

First parameter is present: false
Second parameter is present: true
10

参考链接

www.learnfk.com/java/java8-…