Optional使用和避免Null - Google Guava

本文深入解析Guava库中的Optional类,介绍其如何处理可能为null的对象引用,避免空指针异常,提供了一系列实用方法,如of、absent、fromNullable等,以及如何使用这些方法查询和操作Optional实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Guava Optional 类

Optional 用于包含非空对象的不可变对象。 Optional对象,用于不存在值表示null。这个类有各种实用的方法,以方便代码来处理为可用或不可用,而不是检查null值。

 

 

常用方法

方法类型方法描述
static <T> Optional<T>absent() 
返回没有包含引用的Optional实例。
abstract Set<T>asSet() 
返回一个不可变的单集的唯一元素所包含的实例(如果存在),否则为一个空的不可变的集合。
abstract booleanequals(@Nullable Object object) 
如果object是Optional实例,并且包含的引用彼此相等或两者都不存在,则返回true.
static <T> @Nullable Optional<T>fromJavaUtil(Optional<T> javaUtilOptional) 
返回给定的java.util.Optional,等效com.google.common.base.Optional值,如果参数为null,则返回null
static <T> Optional<T>fromNullable(T nullableReference) 
如果 nullableReference 非null,返回包含该引用的Optional实例,否则返回 absent().
abstract Tget() 
返回必须存在的实例.
abstract inthashCode() 
返回此实例的哈希码。
abstract booleanisPresent() 
如果包含(非null)实例,则返回true。
static <T> Optional<T>of(T reference) 
返回包含给定非null引用的Optional实例。
abstract Optional<T>or(Optional<? extends T> secondChoice) 
如果它有一个值存在,返回Optional,否则返回secondChoice。
abstract Tor(Supplier<? extends T> supplier) 
如果包含实例,则返回该实例,否则返回supplier.get()
abstract Tor(T defaultValue) 
如果包含实例,则返回该实例,否则返回 defaultValue 默认值。
abstract TorNull() 
返回包含的实例(如果存在),否则返回null。
static <T> Iterable<T>presentInstances(Iterable<? extends Optional<? extends T>> optionals) 
从提供的选项中返回每个当前实例的值,按顺序跳过absent()的出现次数。
Optional<T>toJavaUtil() 
返回 java.util.Optional 等效值
static <T> Optional<T>toJavaUtil(@Nullable Optional<T> googleOptional) 
返回给定com.google.common.base.Optional的等效java.util.Optional值,如果参数为null,则返回null。
abstract StringtoString() 
返回此实例的字符串表示形式。
abstract <V> Optional<V>transform(Function<? super T,V> function) 
如果实例存在,则使用给定的函数进行转换; 否则返回 absent()

 

创建 Optional 实例(以下都是静态方法):

List<String> list = null;

   Optional.of:创建一个不能为null值的Optional

try{
    Optional<List<String>> list1 = Optional.of(list); //这里抛异常java.lang.NullPointerException异常
} catch (NullPointerException e){
    e.printStackTrace();
}

 

   Optional.absent:创建一个没有包含引用Optional,就是为NULL的

Optional<List<String>> list3 = Optional.absent();
Optional<String[]> arr1 = Optional.absent();

 

   Optional.fromNullable:创建允许null值的Optional

try {
    Optional<List<String>> listOptional = Optional.fromNullable(list);
} catch (Exception e) {
    e.printStackTrace();
}

 

用 Optional 实例查询引用(以下都是非静态方法):

   Optional.isPresent:检查值是否存在

Optional<List<String>> listOptional = Optional.fromNullable(list);
if(listOptional.isPresent()){
        System.out.println("值存在...");
}

 

   Optional.get:返回必须存在的实例.

Optional<List<String>> listOptional = Optional.fromNullable(list);
if(listOptional.isPresent()){
    System.out.println("值存在...");
    List<String> strings = listOptional.get();
} else if(listOptional.isPresent() == false){
    System.out.println("值不存在...");
    try{
        List<String> strings = listOptional.get(); // 此处抛出:java.lang.IllegalStateException
    } catch (Exception e){
        e.printStackTrace();
    }
}

 

   Optional.or:如果值不为空,就返回值,否则返回一个默认值

Optional<List<String>> listOptional = Optional.fromNullable(list);
List<String> resultList1 = listOptional.or(ArrayList::new);

 

   Optional.or:如果值不为空,就返回值,否则返回一个包含引用的Optional

Optional<List<String>> resultList2 = listOptional.or(Optional.fromNullable(
        Lists.newArrayList("值1", "值2")));


 

   Optional.orNull:返回包含的实例(如果存在),否则返回null。

Optional<List<String>> listOptional = Optional.fromNullable(list);
List<String> result = listOptional.orNull();
System.out.println(result); // null

 

   Optional.toJavaUtil:将 com.google.common.base.Optional 转换为 java.util.Optional

// 方式一:
java.util.Optional<List<String>> strings = Optional.fromNullable(list).toJavaUtil();
// 方式二
java.util.Optional<List<String>> strings1 = Optional.toJavaUtil(Optional.fromNullable(list));

 

   Optional.transform:如果实例存在,则使用给定的函数进行转换; 否则返回 absent()。

List<Integer> list1 = Lists.newArrayList(1, 2, 3);
Optional<List<Integer>> listOptional = Optional.fromNullable(list1);
listOptional.transform(object -> {
    for (int i = 0; i < object.size(); i++) {
        object.set(i, object.get(i) + 1);
    }
    return object; // Optional.of([2, 3, 4])
});

Optional<List<String>> optional = Optional.fromNullable(list);
listOptional.transform(object -> {
    return object; // Optional.absent()
});

 

   Optional.presentInstances:将参数optionals中为null的optional剔除,同时返回值对象的Iterable

List<Optional<Integer>> list = Lists.newArrayList(
        Optional.fromNullable(1),
        Optional.fromNullable(null),
        Optional.fromNullable(2)
);
Iterable<Integer> it = Optional.presentInstances(list);
it.forEach(System.err::println); // 1, 2

 

   Optional.asSet:返回一个不可变的单集的唯一元素所包含的实例(如果存在),否则为一个空的不可变的集合。

Optional<Integer> nullOptional = Optional.absent();
Set<Integer> set1 = nullOptional.asSet();
System.out.println(set1.size()); // 0

Optional<Integer> optional = Optional.of(5);
Set<Integer> set2 = optional.asSet();
System.out.println(set2.size()); // 1

 

 

### Google Guava使用教程与示例代码 Google Guava 是一个功能强大的 Java 工具库,提供了许多简化开发的实用工具方法。以下将详细介绍其核心功能以及相关的示例代码。 #### 1. Guava Cache 使用示例 Guava 提供了本地缓存的支持,可以通过 `CacheBuilder` 来构建缓存实例[^2]。下面是一个简单的缓存示例: ```java import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; import java.util.concurrent.TimeUnit; public class GuavaCacheExample { public static void main(String[] args) { // 创建缓存实例,设置缓存过期时间为10秒 Cache<String, String> cache = CacheBuilder.newBuilder() .maximumSize(100) // 最大缓存条目数为100 .expireAfterWrite(10, TimeUnit.SECONDS) // 缓存写入后10秒过期 .build(); // 添加缓存条目 cache.put("key1", "value1"); // 获取缓存条目 System.out.println("缓存中的值:" + cache.getIfPresent("key1")); // 输出 value1 try { Thread.sleep(11000); // 等待11秒 } catch (InterruptedException e) { e.printStackTrace(); } // 再次获取缓存条目,由于已过期,返回 null System.out.println("缓存中的值:" + cache.getIfPresent("key1")); // 输出 null } } ``` #### 2. Optional使用 Guava 提供了 `Optional` 类型来避免空指针异常。以下是使用 `Optional` 的示例代码: ```java import com.google.common.base.Optional; public class GuavaOptionalExample { public static void main(String[] args) { Optional<String> optional = Optional.of("Hello Guava"); if (optional.isPresent()) { System.out.println("Optional 值存在:" + optional.get()); // 输出 Hello Guava } else { System.out.println("Optional 值不存在"); } } } ``` #### 3. Lists Sets 工具类 Guava 提供了许多集合操作的工具类,例如 `Lists` `Sets`,可以方便地进行集合操作[^3]。以下是一个集合过滤的示例: ```java import com.google.common.collect.Lists; import org.apache.commons.lang3.StringUtils; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class GuavaCollectionsExample { public static void main(String[] args) { List<String> list = Arrays.asList("1", "", "2", "3", null); // 过滤掉空字符串 null 值 List<String> filteredList = list.stream() .filter(x -> StringUtils.isNotEmpty(x)) .collect(Collectors.toList()); // 将列表转换为逗号分隔的字符串 String result = Lists.newArrayList(filteredList).stream() .collect(Collectors.joining(",")); System.out.println("过滤后的结果:" + result); // 输出 1,2,3 } } ``` #### 4. Retryer 示例 Guava 提供了 `Retryer` 类用于实现重试机制。以下是一个简单的重试示例[^1]: ```java import com.google.common.util.concurrent.Retryer; import com.google.common.util.concurrent.RetryerBuilder; import com.google.common.util.concurrent.SimpleTimeLimiter; import com.google.common.util.concurrent.UncheckedTimeoutException; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; public class GuavaRetryerExample { public static void main(String[] args) throws Exception { // 构建 Retryer 实例 Retryer<String> retryer = RetryerBuilder.<String>newBuilder() .retryIfResult(result -> "failure".equals(result)) // 如果结果为 failure 则重试 .retryIfException() // 如果抛出异常则重试 .withWaitStrategy(WaitStrategies.fixedWait(1, TimeUnit.SECONDS)) // 每次重试等待1秒 .withStopStrategy(StopStrategies.stopAfterAttempt(3)) // 最多重试3次 .build(); try { String result = retryer.call(() -> { System.out.println("尝试执行任务..."); return "success"; // 返回 success 表示任务成功 }); System.out.println("任务执行结果:" + result); } catch (ExecutionException | UncheckedTimeoutException e) { e.printStackTrace(); } } } ``` ### 总结 Google Guava 库提供了丰富的工具类方法,能够显著提升开发效率。上述示例展示了缓存、Optional、集合工具类以及重试机制的使用方法。开发者可以根据具体需求选择合适的工具类进行集成。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值