Guava - Guava 基本工具 Preconditions、Optional

Guava

1、Guava 概述
  1. Guava 是 Google 开发的一款 Java 库,旨在弥补标准 JDK 的不足,提升开发效率和代码质量

  2. Guava 提供了一系列实用工具,覆盖了集合、缓存、字符串处理、并发编程等多个方面

2、Guava 引入
  • 在 pom.xml 文件中,引入相关依赖
xml 复制代码
<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>32.1.3-jre</version>
</dependency>

Preconditions

1、基本介绍
  1. checkNotNull 方法:校验引用是否为 null。如果为 null,则抛出 NullPointerException

  2. checkArgument 方法:校验方法的参数是否满足条件。如果不满足,则抛出 IllegalArgumentException

  3. checkState 方法:校验对象的状态是否满足条件。如果不满足,则抛出 IllegalStateException

  4. checkPositionIndex 方法:检查插入位置的索引是否有效,用于在某个位置插入元素,有效范围为 0 ≤ index ≤ size。如果无效,则抛出 IndexOutOfBoundsException

  5. checkElementIndex 方法:检查某个元素的索引是否有效,用于访问已有元素,有效范围为 0 ≤ index < size。如果无效,则抛出 IndexOutOfBoundsException

  6. checkPositionIndexes 方法:检查一个范围是否有效,常用于子列表、子字符串等操作,有效条件为 0 ≤ start ≤ end ≤ size。如果无效,则抛出 IndexOutOfBoundsException

2、演示
  1. checkNotNull 方法
java 复制代码
String input = null;

try {
    Preconditions.checkNotNull(input, "input 不能为 null");
} catch (NullPointerException e) {
    System.out.println(e.getMessage());
}
  • 输出结果

    input 不能为 null

  1. checkArgument 方法
java 复制代码
int value = -1;

try {
    Preconditions.checkArgument(value >= 0, "值必须 >= 0,实际是 %s", value);
} catch (IllegalArgumentException e) {
    System.out.println(e.getMessage());
}
  • 输出结果

    值必须 >= 0,实际是 -1

  1. checkState 方法
java 复制代码
boolean isReady = false;

try {
    Preconditions.checkState(isReady, "未就绪");
} catch (IllegalStateException e) {
    System.out.println(e.getMessage());
}
  • 输出结果

    未就绪

  1. checkPositionIndex 方法
java 复制代码
List<String> list = Arrays.asList("A", "B", "C");
int index = -1;

try {
    Preconditions.checkPositionIndex(index, list.size(), "非有效索引");
} catch (IndexOutOfBoundsException e) {
    System.out.println(e.getMessage());
}
  • 输出结果

    非有效索引 (-1) must not be negative

  1. checkElementIndex 方法
java 复制代码
List<String> list = Arrays.asList("A", "B", "C");
int index = -1;

try {
    Preconditions.checkElementIndex(index, list.size(), "非有效索引");
} catch (IndexOutOfBoundsException e) {
    System.out.println(e.getMessage());
}
  • 输出结果

    非有效索引 (-1) must not be negative

  1. checkPositionIndexes 方法
java 复制代码
List<String> list = Arrays.asList("A", "B", "C");
int startIndex = -1;
int endIndex = 3;

try {
    Preconditions.checkPositionIndexes(startIndex, endIndex, list.size());
} catch (IndexOutOfBoundsException e) {
    System.out.println(e.getMessage());
}
  • 输出结果

    start index (-1) must not be negative

3、注意事项
  1. 测试用例中使用 try-catch 来包装 Preconditions 检查

  2. 但在实际应用中,建议让异常自然抛出,并在入口层统一处理


Optional

1、创建实例
  1. 使用 of 方法,值不能为 null,否则抛出异常 NullPointerException
java 复制代码
Optional<String> present = Optional.of("Hello");
  1. 使用 absent 方法,明确表示值缺失
java 复制代码
Optional<String> absent = Optional.absent();
  1. 使用 fromNullable 方法,值可能为 null
java 复制代码
String str = getStr();

Optional<String> fromNullable = Optional.fromNullable(str);
2、状态检查与值获取
(1)检查是否存在值
java 复制代码
Optional<String> opt = Optional.fromNullable(null);

if (opt.isPresent()) {
    System.out.println("value exist: " + opt.get());
} else {
    System.out.println("value not exist");
}
  • 当值为 null 时,输出结果

    value not exist

java 复制代码
Optional<String> opt = Optional.fromNullable("test");

...
  • 当值不为 null 时,输出结果

    value exist: test

(2)非安全获取值
java 复制代码
Optional<String> opt = Optional.fromNullable(null);

try {
    String value = opt.get();

    System.out.println("value: " + value);
} catch (IllegalStateException e) {
    System.out.println(e.getMessage());
}
  • 当值为 null 时,输出结果

    Optional.get() cannot be called on an absent value

java 复制代码
Optional<String> opt = Optional.fromNullable("test");

...
  • 当值不为 null 时,输出结果

    value: test

(3)安全获取值
java 复制代码
Optional<String> opt = Optional.fromNullable(null);

String safeValue = opt.or("safe value");

System.out.println("value: " + safeValue);
  • 当值为 null 时,输出结果

    value: safe value

java 复制代码
Optional<String> opt = Optional.fromNullable("test");

...
  • 当值不为 null 时,输出结果

    value: test

(4)延迟获取值
java 复制代码
Optional<String> opt = Optional.fromNullable(null);

String lazyValue = opt.or(new Supplier<String>() {

    @Override
    public String get() {
        return getLazyValue();
    }
});

System.out.println("value: " + lazyValue);
java 复制代码
private static String getLazyValue() {
    System.out.println("execute getLazyValue");

    return "lazy value";
}
  • 当值为 null 时,输出结果

    execute getLazyValue
    value: lazy value

java 复制代码
Optional<String> opt = Optional.fromNullable("test");

...
  • 当值不为 null 时,输出结果

    value: test

(5)抛出指定异常
java 复制代码
Optional<String> opt = Optional.fromNullable(null);

try {
    String result = opt.or(new Supplier<String>() {

        @Override
        public String get() {
            throw new IllegalArgumentException("value is required");
        }
    });

    System.out.println("result: " + result);
} catch (IllegalArgumentException e) {
    System.out.println(e.getMessage());
}
  • 当值为 null 时,输出结果

    value is required

java 复制代码
Optional<String> opt = Optional.fromNullable("test");

...
  • 当值不为 null 时,输出结果

    result: test

3、转换操作
(1)转换为大写
java 复制代码
Optional<String> stringOpt = Optional.of("test content");

Optional<String> upperOpt = stringOpt.transform(new Function<String, String>() {

    @Override
    public String apply(String input) {
        return input.toUpperCase();
    }
});

if (upperOpt.isPresent()) {
    System.out.println("value exist: " + upperOpt.get());
} else {
    System.out.println("value not exist");
}
  • 当值不为 null 时,输出结果

    value exist: TEST CONTENT

java 复制代码
Optional<String> stringOpt = Optional.fromNullable(null);

...
  • 当值为 null 时,输出结果

    value not exist

(2)转换为长度
java 复制代码
Optional<String> stringOpt = Optional.fromNullable("test content");

Optional<Integer> lengthOpt = stringOpt.transform(new Function<String, Integer>() {

    @Override
    public Integer apply(String input) {
        return input.length();
    }
});

if (lengthOpt.isPresent()) {
    System.out.println("value exist: " + lengthOpt.get());
} else {
    System.out.println("value not exist");
}
  • 当值不为 null 时,输出结果

    value exist: 12

java 复制代码
Optional<String> stringOpt = Optional.fromNullable(null);

...
  • 当值为 null 时,输出结果

    value not exist

(3)链式转换
java 复制代码
Optional<Integer> doubleOpt = parseAndDouble("  123  ");

if (doubleOpt.isPresent()) {
    System.out.println("value exist: " + doubleOpt.get());
} else {
    System.out.println("value not exist");
}
java 复制代码
public static Optional<Integer> parseAndDouble(String numberStr) {
    return Optional.fromNullable(numberStr)
            .transform(new Function<String, String>() {

                @Override
                public String apply(String input) {
                    return input.trim();
                }
            })
            .transform(new Function<String, Integer>() {

                @Override
                public Integer apply(String input) {
                    return Integer.parseInt(input);
                }
            })
            .transform(new Function<Integer, Integer>() {

                @Override
                public Integer apply(Integer input) {
                    return input * 2;
                }
            });
}
  • 当值不为 null 时,输出结果

    value exist: 246

java 复制代码
Optional<Integer> doubleOpt = parseAndDouble(null);

...
  • 当值为 null 时,输出结果

    value not exist

相关推荐
一 乐5 小时前
婚纱摄影网站|基于ssm + vue婚纱摄影网站系统(源码+数据库+文档)
前端·javascript·数据库·vue.js·spring boot·后端
Boilermaker19925 小时前
[Java 并发编程] Synchronized 锁升级
java·开发语言
Cherry的跨界思维5 小时前
28、AI测试环境搭建与全栈工具实战:从本地到云平台的完整指南
java·人工智能·vue3·ai测试·ai全栈·测试全栈·ai测试全栈
MM_MS5 小时前
Halcon变量控制类型、数据类型转换、字符串格式化、元组操作
开发语言·人工智能·深度学习·算法·目标检测·计算机视觉·视觉检测
꧁Q༒ོγ꧂6 小时前
LaTeX 语法入门指南
开发语言·latex
njsgcs6 小时前
ue python二次开发启动教程+ 导入fbx到指定文件夹
开发语言·python·unreal engine·ue
alonewolf_996 小时前
JDK17新特性全面解析:从语法革新到模块化革命
java·开发语言·jvm·jdk
一嘴一个橘子6 小时前
spring-aop 的 基础使用(啥是增强类、切点、切面)- 2
java
码事漫谈6 小时前
Protocol Buffers 编码原理深度解析
后端
sheji34166 小时前
【开题答辩全过程】以 中医药文化科普系统为例,包含答辩的问题和答案
java