1、使用三元运算符的写法
return users.stream() .filter(user -> id.equals(user.getId())) .map( user -> (user.getData() != null) ? user.getData() : emptyMap() ) .collect(Collectors.toList());
2、使用orElseGet的写法
return users.stream() .filter(user -> id.equals(user.getId())) .map( user -> Optional.ofNullable( user.getData() ).orElseGet( () -> emptyMap() ) ) .collect(Collectors.toList());
3、使用orElse和orElseGet的示例代码
1)当list有值
public static void main(String[] args) { List<Integer> list = Arrays.asList(10,20,30); //通过reduce方法得到一个Optional类 int a = list.stream().reduce(Integer::sum).orElse(get("a")); int b = list.stream().reduce(Integer::sum).orElseGet(() -> get("b")); System.out.println("a "+a); System.out.println("b "+b); } public static int get(String name){ System.out.println(name+"执行了方法"); return 1; }
执行结果:
a执行了方法
a的值:60
b的值:60
2)当list是空值
public static void main(String[] args) { List<Integer> list = Arrays.asList(); //通过reduce方法得到一个Optional类 int a = list.stream().reduce(Integer::sum).orElse(get("a")); int b = list.stream().reduce(Integer::sum).orElseGet(() -> get("b")); System.out.println("a "+a); System.out.println("b "+b); } public static int get(String name){ System.out.println(name+"执行了方法"); return 1; }
执行结果:
a执行了方法
b执行了方法
a的值:1
b的值:1
4、orElse和orElseGet使用区别
从上面可以看出来,当Optonal的值是空值时,无论orElse
还是orElseGet
都会执行;而当返回的Optional有值时,orElse
会执行,而orElseGet
不会执行。