欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Optional使用

程序员文章站 2022-06-08 10:18:48
...

首先:
配合函数式编程发挥最大作用。
一定要避免:

if(obj.ifPresent()){
...
}else{
...
}

三种构造方式:
Optional.of(obj):要求传入对象不能为空
Optional.ofNullable(obj):传入对象可以为空
Optional.empty():空
ifPresent,orElse,orElseGet使用

package com.spc.testoptional;

import java.util.Optional;

/**
 * @author 苏平超
 *方法参数为空时会直接报异常
 *Optional<Integer> a=null; a.isPresent()任何对a的调用都会报错,因为a指向的是Optional<Integer>对象
 *应该像下面这样定义
 */
public class test1 {
	
	public static void main(String[] args) {
		Integer a=null;
		Integer b=3;
		Optional<Integer> c=Optional.ofNullable(a);
		Optional<Integer> d=Optional.ofNullable(b);
		testIfPresent(d);
		testOrElse(c);
		testOrElseGet(c);
	}
	/**
	 * @param e
	 * 存在则做事
	 */
	public static void testIfPresent(Optional<Integer> e) {
		e.ifPresent(System.out::println);
	}
	/**
	 * @param e
	 * 存在即返回,无则返回默认值
	 * 调用orElse()返回orElse()的参数,不会往e里添加元素
	 * 所以e.ifPresent(System.out::println);判断还是为空
	 */
	public static void testOrElse(Optional<Integer> e) {
		Integer temp=4;
		System.out.println(e.orElse(temp));
		//e.ifPresent(System.out::println);
	}
	/**
	 * @param e
	 * 存在即返回,无则由函数产生
	 * 调用orelseget,调用函数
	 */
	public static void testOrElseGet(Optional<Integer> e) {
		System.out.println(e.orElseGet(()->get()));	
	}
	public static Integer get() {
		return 5;
	}
  
}

map函数使用(理解意思):
当 user.isPresent() 为真, 获得它关联的 对象, 为假则返回一个空集合时, 我们用上面的 orElse, orElseGet 方法都乏力时, 那原本就是 map 函数的责任
错误使用方法1:

if(user.isPresent()) {
  return user.get().getOrders();
} else {
  return Collections.emptyList();
}

正确使用方法1:

return user.map(u -> u.getOrders()).orElse(Collections.emptyList())

错误使用2:

User user = .....
if(user != null) {
  String name = user.getUsername();
  if(name != null) {
    return name.toUpperCase();
  } else {
    return null;
  }
} else {
  return null;
}

正确使用2(name是上一级获得的参数):

return user.map(u -> u.getUsername())
           .map(name -> name.toUpperCase())
           .orElse(null);

注意:这里user本身就是实例了,如果最终都不为空的话最终返回的就是user.getUsername().toUpperCase(),第一个map里的u就是参数及user

相关标签: 新知识学习