Java案例解析-Optional处理
/Java_Guide
Optional 类设计用来在返回值可能合法为 null 时相关的操作。Optional 实例具有两种状态,要么是对 T 类型实例的引用 ,要么为空
一、Optional的创建
1-1 定义 static < T > Optional < T > empty ()
static < T > Optional < T > ofNullable ( T value )
static OptionalInt of ( int value )
static OptionalLong of ( long value )
static OptionalDouble of ( double value )
1-2 Optional.of、Optional.ofNullable 或 Optional.empty 方法 Optional xx = ( value == null ? Optional . empty () : Optional . of ( value ));
Optional xx = Optional . ofNullable ( value );
1-3 改造bean的get方法返回Optional public class Department {
private Manager boss ;
public Optional < Manager > getBoss () {
return Optional . ofNullable ( boss );
}
public void setBoss ( Manager boss ) {
this . boss = boss ;
}
}
二、取值
确定 Optional 中存在值,则使用 get 方法,否则使用 orElse 方法;也可以在当值存在时使用 ifPresent 方法执行 Consumer
2-1 Optional < String > firstEven = Stream . of ( "five" , "even" , "length" , "string" , "values" )
. filter ( s -> s . length () % 2 == 0 )
. findFirst ();
System . out . println ( first . isPresent () ? first . get () : "No even length strings" ); // (1)
System . out . println ( firstOdd . orElse ( "No odd length strings" )); // (2)
isPresent 方法返回 true 时才调用 get 方法,如果Optional中没有值时直接调用了get方法,会抛出NoSuchElementException
使用上比1更方便,如果包含的值存在,则 orElse 方法返回该值,否则返回提供的默认值-也就是"No odd length strings"
2-2 Optional有值时使用isPresent直接进行消费 Optional < String > first = Stream . of ( "five" , "even" , "length" , "string" , "values" )
. filter ( s -> s . length () % 2 == 0 )
. findFirst ();
first . ifPresent ( val -> System . out . println ( "Found an even-length string" )); // (1)
ifPresent 方法支持提供一个仅当 Optional 包含值时才执行的 Consumer
2-3 orElse 与 orElseGet区别 Optional < ComplexObject > val = values . stream . findFirst ()
val . orElse ( new ComplexObject ()); // (1)
val . orElseGet (() -> new ComplexObject ()) // (2)
orElse方法无论Optional内是否有值都会创建一个新对象
orElseGet方法只有在Optional没有值时才会执行代码创建新对象;但是如果参数都是字符串,则orElse与orElseGet没区别
三、抛异常
当Optional内没有值时直接调用get方法会抛出NoSuchElementException,或者使用orElseThrow自定义:
3-1 Optional < String > first = Stream . of ( "five" , "even" , "length" , "string" , "values" )
. filter ( s -> s . length () % 2 == 0 )
. findFirst ();
System . out . println ( first . orElseThrow ( NoSuchElementException :: new )); // (1)
orElseThrow接收由 Supplier 产生的异常,当Optional不包含值时抛出
流式操作示例 文件处理
创建日期:
April 22, 2022 22:27:24
最后更新:
March 12, 2023 01:10:39