相关文章推荐
帅气的弓箭  ·  PowerApps ...·  1 周前    · 
孤独的火龙果  ·  Oracle ...·  1 年前    · 
健壮的回锅肉  ·  _get_errno | ...·  1 年前    · 

程序猿日常开发中,为了避免NullPointerException异常,会写很多if else的判断。如果if else太多会让代码显的很乱,那如何减少if else的使用呢?

减少if else的方式之一,利用JDK8提供的Optional

ofNullable()、map()、orElseGet()的使用示例

示例中getStartTime()获取String类型的时间字符串并返回。执行逻辑:

  1. 调动selectStartTime()查询DB返回LocalDateTime值;
  2. 响应值dateTime如果为null,就给一个默认值;
  3. 响应值dateTime如果不为null,就把dateTime值转换成String类型的时间字符串并返回。

getStartTime()方法体用了5行代码。

private String getStartTime() {
    LocalDateTime dateTime = selectStartTime();
    if (dateTime == null) {
        return "2020-01-01 00:00:00";
    return dateTimeToString(dateTime);
private LocalDateTime selectStartTime(){
   //去DB查找业务需要的LocalDateTime值
protected String dateTimeToString(LocalDateTime dateTime) {
    if (dateTime == null) {
        return null;
    return DateTimeFormatter.ofPattern(Constants.DEFAULT_DATE_TIME_FORMAT).format(dateTime);

接着我们利用JDK8提供的Optional类,把以上5行代码简化成下面的1行代码。

private String getStartTime() {
    return Optional.ofNullable(selectStartTime()).map(e->dateTimeToString(e)).orElseGet(()->"2020-01-01 00:00:00");

1行代码达到同样的效果。

ofNullable()、orElseGet()的使用示例

如果上面没看懂,那看一下这个简化版的示例:

User user = getCacheUser(1);
if (user == null) {
    user = selectUserById(1);
static class User {
     private String name;
     private Address address;
     //Get、Set方法
 static class Address {
     private String area;
     private String province;
     private String city;
     //Get、Set方法

接着我们利用JDK8提供的Optional类,把以上4行代码简化成下面的1行代码。

User user = Optional.ofNullable(getCacheUser(1)).orElseGet(() -> selectUserById(1));

注意:Optional的orElseGet()的参数是一个函数式接口,只有在条件为null时才会执行orElseGet()里的方法,这是跟orElse()最大的区别,用orElseGet()性能会更好。

ofNullable()、map()、orElseGet()的使用示例

public String getCity(User user)  throws Exception{
   if(user!=null){
       if(user.getAddress()!=null){
           Address address = user.getAddress();
           if(address.getCity()!=null){
               return address.getCity();
   throw new Excpetion("对象为空"); 

接着我们利用JDK8提供的Optional类,把以上多层if为空的判断简化成下面的1行代码。

public String getCity(User user) throws Exception{
    return Optional.ofNullable(user)
                   .map(u-> u.getAddress())
                   .map(a->a.getCity())
                   .orElseThrow(()->new Exception("对象为空"));

ofNullable()、ifPresent()的使用示例

if(user!=null){
    dosomething(user);

接着我们利用JDK8提供的Optional类,把以上3行代码简化成下面的1行代码。

 Optional.ofNullable(user).ifPresent(u->dosomething(u));

ofNullable()、map()、orElseGet()的使用示例

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;

接着我们利用JDK8提供的Optional类,把以上多层if为空的判断简化成下面的1行代码。

public User getUser(User user) {
    return Optional.ofNullable(user)
                   .filter(u->"zhangsan".equals(u.getName()))
                   .orElseGet(()-> {
                        return new User("zhangsan");
                   });
                    程序猿开日常开发中,为了避免NullPointerException异常,会写很多if else的判断。如果if else太多会让代码显的很乱,那如何减少if else的使用呢?减少if else的方式之一,利用JDK8提供的Optional。代码示例:示例中getStartTime()获取String类型的时间字符串并返回。执行逻辑:调动selectStartTime()查询DB返回LocalDateTime值;响应值dateTime如果为null,就给一个默认值;响应值dateTime
if else 判断利用策略模式:
https://blog.csdn.net/weixin_41987908/article/details/100898555
2:利用Optional避免多次if else判断:
对象层层嵌套,为了逻辑严谨必须要进行空判断,如果不层层判断,有可能在某一层上收获一个空指针,而Optional优雅的帮我们处理掉这样的逻辑。
   School ...
     * Constructs an instance with the value present.
     * @param value the non-null value to be present
     * @thro
对接物联网设备,设备传递命令,然后根据命令操作不同的行为,最后返回。
现在问题是if else 太多了,代码太长,项目不好维护和扩展,代码如下:
public static String execute(String command, String jsonStr){
    if ("openDoor".equals(command)) {
        // 具体业务代码会比较多,这里只是做一个简单的代码框架例子。
        return "开门";
    } else if ("clo
函数式接口是JDK8的一个非常重要新特性,使用起来可以极大的简化代码。
函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。
函数式接口可以被隐式转换为 lambda 表达式。
1、四大函数式接口
消费型接口:Consumer
供给型接口:Supplier
函数型接口:Function
断言型接口:Predicate
2、处理异常
     * 异常处理接口
				
在我们的java开发过程中,NullPointerException一直是一个头疼的问题,因为你永远不知道null出现在哪。如下段代码。 Integer number=user.getUserDetail().getUserIntegral().getIntegral().getIntegralDetail().getNumber(); 我们用上述方法想拿到number,可能会出现NullPointerException异常,通 常我们会使用下边的代码判断拿值: Integer number; 最近开发平台的一个需求,在写代码时有遇到这样的场景:if A!=null,则获取A.getA,如果A.getA!=null,则继续获取A.getA.getB ,差不多有5层左右,最早的写法是按照上述一直去做if判断,如果不为null,继续做判断,直到获取想要的值 缺点:可读性还可以,但写的实在不优雅,且前端同学吐槽接口返回数据超级慢(当然不一定是这个原因)
哈希表在JDK7和JDK8中的实现方式有所不同,主要体现在以下几个方面: 1. JDK7中的哈希表采用数组+链表的方式实现,而JDK8中则采用数组+链表/红黑树的方式实现,这是因为JDK8在哈希表中增加了红黑树的支持,可以更好地处理哈希冲突,提高了查询效率。 2. JDK8中的哈希表在插入元素时,会先判断当前桶中链表的长度是否超过了阈值,如果超过了,则将链表转换为红黑树,这样可以更好地处理哈希冲突,提高了查询效率。 3. JDK8中的哈希表在扩容时,会采用一种新的方式,即当桶中元素个数达到一定阈值时,会先进行一次扩容,然后再将元素重新分配到新的桶中,这样可以更好地避免哈希冲突,提高了查询效率。 总之,JDK8中的哈希表相对于JDK7中的哈希表,在性能和扩展性方面都有所提高。