Optional类
导语:调用一个方法得到了返回值却不能直接将返回值作为参数去调用别的方法。我们首先要判断这个返回值是否为null,只有在非空的前提下才能将其作为其他方法的参数。
-
of,为非null的值创建一个Optional,of方法通过工厂方法创建Optional类。需要注意的是,创建对象时传入的参数不能为null。如果传入参数为null,则抛出NullPointerException 。
Optional<String> name=Optional.of("a"); Optional<Test11> test11=Optional.of(new Test11(1L,"test11")); //Optional<Test11> test112=Optional.of(null); //java.lang.NullPointerException System.out.println(name.get()); //a System.out.println(test11.get()); //Test11{testId=1, testName='test11'} System.out.println(test11.getClass()); //class java.util.Optional
-
ofNullable,为指定的值创建一个Optional,如果指定的值为null,则返回一个空的Optional。
Optional<Test11> test11Optional=Optional.ofNullable(new Test11()); Optional<Test11> test11Optional2=Optional.ofNullable(null); System.out.println(test11Optional.get()); //Test11{testId=null, testName='null'} System.out.println(test11Optional2.get()); //java.util.NoSuchElementException: No value present,虽然没值但是有Optional对象
-
isPresent(),如果值存在返回true,否则返回false。
Optional<Test11> test11Optional=Optional.ofNullable(new Test11()); Optional<Test11> test11Optional2=Optional.ofNullable(null); System.out.println(test11Optional.isPresent()); //true System.out.println(test11Optional2.isPresent()); //false
-
get(),如果Optional有值则将其返回,否则抛出NoSuchElementException。如上第2点。
-
ifPresent(),如果Optional实例有值则为其调用consumer,否则不做处理.
Optional<Test11> test11IfPresent=Optional.of(new Test11(1L,"test11")); test11IfPresent.ifPresent(System.out::println); //Test11{testId=1, testName='test11'} public void ifPresent(Consumer<? super T> consumer) { if (value != null) consumer.accept(value); }
-
orElse(),如果值不为null,orElse方法返回Optional实例的值。如果为null,返回传入的消息。和指定的类型一致
Optional<Test11> test11Optional2=Optional.ofNullable(null); //Test11{testId=404,testName='指定值'} System.out.println(test11Optional2.orElse(new Test11(404L, "指定值"))); Optional<Test11> test11IfPresent=Optional.of(new Test11(1L,"test11")); //Test11{testId=1, testName='test11'} System.out.println(test11IfPresent.orElse(new Test11(404L, "指定值")));
-
orElseGet(),orElse方法将传入的字符串作为默认值,orElseGet方法可以接受Supplier接口的实现用来生成默认值(间接或直接父类为指定的类型)
Optional<Test11> test11IfPresent=Optional.of(new Test11(1L,"test11")); Optional<Test11> test11Optional2=Optional.ofNullable(null); //Test11{testId=1, testName='test11'} System.out.println(test11IfPresent.orElseGet(Test11::new)); //Test11{testId=404, testName='指定值'} System.out.println(test11Optional2.orElseGet(()->new Test11(404L, "指定值"))); public T orElseGet(Supplier<? extends T> other) { return value != null ? value : other.get(); }
-
orElseThrow(),如果有值则将其返回,否则抛出supplier接口创建的异常。
Optional<Test11> test11IfPresent=Optional.of(new Test11(1L,"test11")); Optional<Test11> test11Optional2=Optional.ofNullable(null); //Test11{testId=1, testName='test11'} System.out.println(test11IfPresent.orElseThrow(() -> new RuntimeException())); //抛异常 test11Optional2.orElseThrow(()->new RuntimeException()); public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X { if (value != null) { return value; } else { throw exceptionSupplier.get(); } }
-
map(),类似于stream流的map,
Optional<Test11> test11IfPresent=Optional.of(new Test11(1L,"test11")); Optional<Test11> test11Optional2=Optional.ofNullable(null); //te,对对象进行操作,并返回 System.out.println(test11IfPresent.map((value) -> value.getTestName().substring(0,2)).get()); //java.util.NoSuchElementException: No value present System.out.println(test11Optional2.map((value) -> value.getTestName().substring(0,2)).get());
-
flatMap(),flatMap方法与map方法类似,区别在于mapping函数的返回值不同。map方法的mapping函数返回值可以是任何类型T,而flatMap方法的mapping函数必须是Optional。
Optional<Test11> test11IfPresent=Optional.of(new Test11(1L,"test11")); Optional<Test11> test11Optional2=Optional.ofNullable(null); //Test11{testId=1, testName='test11'} System.out.println(test11IfPresent.flatMap((va) -> Optional.of(va)).get()); //Test11{testId=33, testName='test11'} System.out.println(test11IfPresent.flatMap((va) ->{ va.setTestId(33L); return Optional.of(va); }).get()); //java.util.NoSuchElementException: No value present System.out.println(test11Optional2.flatMap((va) -> Optional.of(va)).get()); 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)); } }
-
filter(),过滤器
Optional<Test11> test11IfPresent=Optional.of(new Test11(1L,"test11")); //Test11{testId=1, testName='test11'} System.out.println(test11IfPresent.filter((va) -> va.getTestName().length() > 3).get()); java.util.NoSuchElementException: No value present System.out.println(test11IfPresent.filter((va) -> va.getTestName().length() > 10).get()); public Optional<T> filter(Predicate<? super T> predicate) { Objects.requireNonNull(predicate); if (!isPresent()) return this; else return predicate.test(value) ? this : empty(); }