教你使用UUID、Optional类 | 带你学《Java语言高级特性》之三十一

简介: 在项目运行中通常会遇到大批量用户、资源文件命名问题、空指针传递异常等问题,为了解决这些问题,Java推出了UUID来生成不重复字符串、使用Optional类来处理空值。

上一篇:教你借助占位符定制资源内容 | 带你学《Java语言高级特性》之三十
在项目运行中通常会遇到大批量用户、资源文件命名问题、空指针传递异常等问题,为了解决这些问题,Java推出了UUID来生成不重复字符串、使用Optional类来处理空值。

【本节目标】
通过阅读本节内容,你可以了解到UUID类生成字符串的原理,并能使用UUID类实现字符串的获取与反向计算UUID内容,灵活运用Optional类提供的各种方法处理程序中可能会出现的null值问题。

UUID类

UUID是一种生成无重复字符串的程序类,这种程序类的主要功能是根据时间戳实现一个自动的无重复的字符串定义。
一般在获取UUID时候往往都是随机生成的一个的内容,所以可以通过如下方式获取:

  • 获取UUID对象:public static UUID randomUUID();
  • 根据字符串获取UUID内容:public static UUID fromString(String name);
import java.util.UUID;
public class JavaAPIDemo {
    public static void main(String[] args) throws Exception {
        UUID uid=UUID.randomUUID();
        System.out.println(uid.toString());  //8fb68484-e744-48e8-88d1-4063d2728d26
    }
}
AI 代码解读

在对一些文件进行自动命名处理的情况下,UUID类型非常好用。

Optional类

Optional类的主要功能是进行null的相关处理,在以前进行程序开发的时候,如果为了防止程序中出现空指向异常,往往追加有null的验证。

范例:传统的引用传递问题

public class JavaAPIDemo {
    public static void main(String[] args) throws Exception {
        MessageUtil.useMessage(MessageUtil.getMessage());
    }
}
class MessageUtil{
    private MessageUtil(){};
    public static IMessage getMessage(){
        return null;
    }
    public static IMessage useMessage(IMessage msg){     
        if(msg!=null){
            System.out.println(msg.getContent());  //有可能因为null,导致空指向
        }
    }
}
interface IMessage{
    public String getContent();
}
class MessageImpl implements IMessage{
    @Override
    public String getContent() {
        return "www.mldn.cn";
    }
}
AI 代码解读

在引用接收的一方往往都是被动的进行判断,所以为了解决这种被动的处理操作,在Java类中提供有一个Optional类,这个类可以实现null的处理操作。在这个类里面提供有如下的一些操作方法:

  • 返回空数据:public static Optional empty();
  • 获取数据:public T get();
  • 保存数据,但是不允许出现null:public static Optional of(T value);

    • 如果在保存数据的时候存在有null,则会抛出NullPointerException异常;
  • 保存数据,允许为空:public static Optional ofNullable(T value);
  • 空的时候返回其他数据:public T orElse(T other);

image.png
Optional类

范例:修改程序,按照正规的结构完成

import java.util.Optional;
public class JavaAPIDemo {
    public static void main(String[] args) throws Exception {
        MessageUtil.useMessage(MessageUtil.getMessage().get());//获取数据
        MessageUtil.useMessage(temp);
    }
}
class MessageUtil{
    private MessageUtil(){};
    public static Optional<IMessage> getMessage(){
        IMessage message=new MessageImpl();
        return Optional.of(new MessageImpl());//有对象
    }
    public static void useMessage(IMessage msg){ 
        if(msg!=null){
            System.out.println(msg.getContent()); //有可能因为null,导致空指向
        }   //www.mldn.cn
    }
}
interface IMessage{
    public String getContent();
}
class MessageImpl implements IMessage{
    @Override
    public String getContent() {
        return "www.mldn.cn";
    }
}
AI 代码解读

如果说现在数据保存的内容为null,则就会在保存处出现异常:

public static Optional<IMessage> getMessage(){
        return Optional.of(null);//有对象
    }    //java.lang.NullPointerException
AI 代码解读

由于Optional类中允许保存有null的内容,所以在数据获取时也可以进行null的处理,但是如果为null,则在使用get()获取数据的时候就会出现“java.util.NoSuchElementException:No value present”异常信息,所以此时可以更换为orElse()方法。

范例:处理null

import java.util.Optional;
public class JavaAPIDemo {
    public static void main(String[] args) throws Exception {
        IMessage message=MessageUtil.getMessage().orElse(new MessageImpl());//获取数据
        MessageUtil.useMessage(temp);
    }
}
class MessageUtil{
    private MessageUtil(){};
    public static Optional<IMessage> getMessage(){
        return Optional.ofNullable(null);//有对象
    }
    public static void useMessage(IMessage msg){
        if(msg!=null){
            System.out.println(msg.getContent());//有可能因为null,导致空指向
        }  //www.mldn.cn
    }
}
interface IMessage{
    public String getContent();
}
class MessageImpl implements IMessage{
    @Override
    public String getContent() {
        return "www.mldn.cn";
    }
}
AI 代码解读

在所有引用数据类型的操作处理之中,null是一个重要的技术问题,所以JDK1.8后提供的Optional类对于null的处理很有帮助,同时也是在日后进行项目开发之中使用次数很多的一种程序类。

想学习更多的Java的课程吗?从小白到大神,从入门到精通,更多精彩不容错过!免费为您提供更多的学习资源。
本内容视频来源于阿里云大学

下一篇:借助ThreadLocal实现多线程安全 | 带你学《Java语言高级特性》之三十二
更多Java面向对象编程文章查看此处

相关文章
|
2天前
|
《从头开始学java,一天一个知识点》之:输入与输出:Scanner与System类
你是否也经历过这些崩溃瞬间?三天教程连`i++`和`++i`都说不清,面试时`a==b`与`equals()`区别大脑空白,代码总是莫名报NPE。这个系列就是为你打造的Java「速效救心丸」!每天1分钟,地铁通勤、午休间隙即可学习。直击高频考点和实际开发中的“坑位”,拒绝冗长概念,每篇都有可运行代码示例。涵盖输入输出基础、猜数字游戏、企业编码规范、性能优化技巧、隐藏技能等。助你快速掌握Java核心知识,提升编程能力。点赞、收藏、转发,助力更多小伙伴一起成长!
30 19
|
3天前
|
《从头开始学java,一天一个知识点》之:字符串处理:String类的核心API
🌱 **《字符串处理:String类的核心API》一分钟速通!** 本文快速介绍Java中String类的3个高频API:`substring`、`indexOf`和`split`,并通过代码示例展示其用法。重点提示:`substring`的结束索引不包含该位置,`split`支持正则表达式。进一步探讨了String不可变性的高效设计原理及企业级编码规范,如避免使用`new String()`、拼接时使用`StringBuilder`等。最后通过互动解密游戏帮助读者巩固知识。 (上一篇:《多维数组与常见操作》 | 下一篇预告:《输入与输出:Scanner与System类》)
35 11
Java语言位运算符详解
Java语言提供了7种位运算符:按位与(&)、按位或(|)、按位异或(^)、取反(~)、左移(&lt;&lt;)、带符号右移(&gt;&gt;)和无符号右移(&gt;&gt;&gt;)。这些运算符主要用于对long、int、short、byte和char类型的数据进行二进制位级别的操作,不能用于double、float和boolean类型。文中详细讲解了每种运算符的规则和应用场景,并指出位运算在实际开发中有重要应用价值,不仅限于面试。
课时37:综合实战:数据表与简单Java类映射转换
今天我分享的是数据表与简单 Java 类映射转换,主要分为以下四部分。 1. 映射关系基础 2. 映射步骤方法 3. 项目对象配置 4. 数据获取与调试
课时11:综合实战:简单Java类
本次分享的主题是综合实战:简单 Java 类。主要分为两个部分: 1.简单 Java 类的含义 2.简单 Java 类的开发
|
9天前
|
课时14:Java数据类型划分(初见String类)
课时14介绍Java数据类型,重点初见String类。通过三个范例讲解:观察String型变量、&quot;+&quot;操作符的使用问题及转义字符的应用。String不是基本数据类型而是引用类型,但使用方式类似基本类型。课程涵盖字符串连接、数学运算与字符串混合使用时的注意事项以及常用转义字符的用法。
|
4月前
|
在 Java 中,一个类可以实现多个接口吗?
这是 Java 面向对象编程的一个重要特性,它提供了极大的灵活性和扩展性。
224 58
|
5月前
|
Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口
【10月更文挑战第20天】《JAVA多线程深度解析:线程的创建之路》介绍了Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口。文章详细讲解了每种方式的实现方法、优缺点及适用场景,帮助读者更好地理解和掌握多线程编程技术,为复杂任务的高效处理奠定基础。
88 2
|
5月前
|
在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口
【10月更文挑战第20天】在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口。本文揭示了这两种方式的微妙差异和潜在陷阱,帮助你更好地理解和选择适合项目需求的线程创建方式。
77 3
|
5月前
|
Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点
【10月更文挑战第20天】Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点,重点解析为何实现Runnable接口更具灵活性、资源共享及易于管理的优势。
87 1

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等