文章目录
前言:项目中有时候就是喜欢有些小伙伴喜欢用这种骚东西(还有lamada函数式编程那类东西),要看懂和维护代码,必须得会啊。这东西久不用不看,有时候碰到还是会顿一下,今天来复习复习。一些场景下使用还是不错的!
一、语法
1. empty()
empty()返回一个空的Optional对象
2. of(T value)
通过of方法所构造出的Optional对象
- 当value值为空时,会报NullPointerException异常
- 当value值不为空时,正常构造Optional对象
3.ofNullable(T value)
ofNullable方法在构造Optional的时候如果value为空,那么返回empty方法构建的Optional对象(一个Optional中value为空的Optional对象),也就是说ofNullable支持空值得创建
4. isPresent和ifPresent
ifPresent方法判断Optional中的value是否为空,不为空返回true;而ifPresent方法是在Optional中value不为空的情况下做一些操作。
if(user!=null){
dosomething(user);
}
转换
Optional.ofNullable(user)
.ifPresent(u->{
dosomething(u);
});
5.filter(Predicate<? super T> predicate)
filter方法在Optional中value不为空的情况下对Optional中的值进行过滤
示例
public void setName(String name) throws IllegalArgumentException {
this.name = Optional.ofNullable(name).filter(User::isNameValid)
.orElseThrow(()->new IllegalArgumentException("Invalid username."));
}
optUser.filter(u -> u.getAge() >= 18).ifPresent(u -> System.out.println("Adult:" + u));
6.map和flatMap
map和flatMap对Optional中的对象进行转换值的操作,这两个方法唯一的区别就是接受的参数不同
Optional.ofNullable(user).map(User::getAddress);
Optional.ofNullable(user).flatMap(u ->Optional.ofNullable(u.getAddress()));
flatMap处理的参数为Optional类型;上图方法均是获取Address写法
7. orElse和orElseGet以及orElseThrow
orElse和orElseGet以及orElseThrow都是处理Optional值为空的情况,如果传入的value为空,进行操作,orElseThrow在value为空的情况抛出异常。 orElse在orElseGet的区别在与,如果传入的value不为空,orElse中的操作仍然要执行,如下图,在user不为空的情况下,仍然会输出display和创建一个新的User对象
public void optional0rElse(User user) throws Exception {
Optional.ofNullable(user).orElse(display());
Optional.ofNullable(user).orElseGet(this::display);
Optional.ofNullable(user).orElseThrow(() ->new Exception("display"));
}
public User display(){
System.out.println("display" );return new User();
}
String name = Optional.ofNullable(user).map(User::getName).orElse("no name");
import java.util.Optional;
public class Main {
public static void main(String[] args){
String nullValue = null;
String optional = Optional.ofNullable(nullValue).orElse("Su");
System.out.println(optional);
String optionalGet = Optional.ofNullable(nullValue).orElseGet(() -> "Xiao");
System.out.println(optionalGet);
String nonNullOptional = Optional.ofNullable("Susan").orElse("Su");
System.out.println(nonNullOptional);
String nonNullOptionalGet = Optional.ofNullable("Molly").orElseGet(() -> "Xiao");
System.out.println(nonNullOptionalGet);
}
}
// 结果
Su
Xiao
Susan
Molly
二、示例
1.示例一
public static String getChampionName(Competition comp) throws IllegalArgumentException {
if (comp != null) {
CompResult result = comp.getResult();
if (result != null) {
User champion = result.getChampion();
if (champion != null) {
return champion.getName();
}
}
}
throw new IllegalArgumentException("The value of param comp isn't available.");
}
改写:
public static String getChampionName(Competition comp) throws IllegalArgumentException {
return Optional.ofNullable(comp)
.map(c -> c.getResult())
.map(r -> r.getChampion())
.map(u -> u.getName())
.orElseThrow(() -> new IllegalArgumentException("The value of param comp isn't available."));
}
2.示例二
public User getUser(User user) throws Exception{
if(user!=null){
String name = user.getName();
if("zhangsan".equals(name)){
return user;
}
}else{
user = new User();
user.setName("zhangsan");
return user;
}
}
改写:
public User getUser(User user) {
return Optional.ofNullable(user)
.filter(u->"zhangsan".equals(u.getName()))
.orElseGet(()-> {
User user1 = new User();
user1.setName("zhangsan");
return user1;
});
}
Java函数式编程:Optional实用技巧及示例解析
本文回顾了Java中Optional类的常用方法如empty(), ofNullable(), isPresent(), filter(), map(), flatMap()等,并提供了示例说明如何在实际项目中优雅处理null值和执行条件操作。深入理解并掌握这些技巧有助于提升代码质量和可读性。
5806

被折叠的 条评论
为什么被折叠?



