Java java.util.Objects类

Java java.util.Objects类,用户希望使用静态工具方法实现非空验证、比较等操作,使用 Java 7 引入的 java.util.Objects 类,它在流处理中相当有用。Java 7 引入的 Objects 类是一种不甚知名的类,它定义了处理各种任务所需的静态方法。

Java java.util.Objects类 问题描述

用户希望使用静态工具方法实现非空验证、比较等操作。

Java java.util.Objects类 解决方案

使用 Java 7 引入的 java.util.Objects 类,它在流处理中相当有用。

Java java.util.Objects类 具体实例

Java 7 引入的 Objects 类是一种不甚知名的类,它定义了处理各种任务所需的静态方法。
static boolean deepEquals(Object a, Object b)
  验证两个数组是否深层相等(deep equality),该方法在数组比较中尤其有用。
static boolean equals(Object a, Object b)
  验证两个参数是否彼此相等,它是空安全(null safe)的。
static int hash(Object... values)
  为输入值序列生成散列码(hash code)。
static String toString(Object o)
  如果参数不为 null 则返回调用 toString 的结果,否则返回 null
static String toString(Object o, String nullDefault)
  如果第一个参数不为 null,返回调用 toString 的结果;如果第一个参数为 null,返回第二个参数。
此外,可以通过 requireNonNull 方法的各种重载形式来验证参数。
static <T> T requireNonNull(T obj)
  如果参数不为 null 则返回 T,否则抛出 NullPointerException
static <T> T requireNonNull(T obj, String message)
  与上一个方法相同,但由于参数为 null 而抛出的 NullPointerException 将显示指定的消息。
static <T> T requireNonNull(T obj, Supplier<String> messageSupplier)
  与上一个方法相同,但如果第一个参数为 null,则调用给定的 SupplierNullPointerException 生成消息。
可以看到,最后一个方法传入 Supplier<String> 作为参数,这也是为什么本书会讨论 Objects 类的原因。不过,更有说服力的原因在于 Java 8 为 Objects 类引入的 isNullnonNull 方法,二者返回布尔值。
static boolean isNull(Object obj)
  如果提供的引用为 null 则返回 true,否则返回 false
static boolean nonNull(Object obj)
  如果提供的引用不为 null 则返回 true,否则返回 false
上述方法的优点在于,它们可以用作筛选器的 Predicate 实例。
我们以返回集合的类为例进行说明。例 5-1 定义了两个方法,分别返回完整的集合(无论集合的性质如何)与滤掉空元素的集合。

例 5-1 返回集合与滤掉空元素

List<String> strings = Arrays.asList(
    "this", null, "is", "a", null, "list", "of", "strings", null);

List<String> nonNullStrings = strings.stream()
    .filter(Objects::nonNull)       ➊
    .collect(Collectors.toList());

➊ 滤掉空元素
如例 5-2 所示,可以使用 Objects.deepEquals 方法进行测试。

例 5-2 筛选器测试

@Test
public void testNonNulls() throws Exception {
    List<String> strings =
        Arrays.asList("this", "is", "a", "list", "of", "strings");
    assertTrue(Objects.deepEquals(strings, nonNullStrings);
}

我们将上述过程一般化,使之不仅适用于字符串。例 5-3 所示的代码可以从任何列表中滤掉空元素。

例 5-3 从泛型列表(generic list)中滤掉空元素

public <T> List<T> getNonNullElements(List<T> list) {
    return list.stream()
            .filter(Objects::nonNull)
            .collect(Collectors.toList());
}

可以看到,对于一个生成 List(其中多个元素为空)的方法,通过上述代码滤掉其中的空元素并非难事。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程