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
,则调用给定的 Supplier
为 NullPointerException
生成消息。
可以看到,最后一个方法传入 Supplier<String>
作为参数,这也是为什么本书会讨论 Objects
类的原因。不过,更有说服力的原因在于 Java 8 为 Objects
类引入的 isNull
和 nonNull
方法,二者返回布尔值。
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
(其中多个元素为空)的方法,通过上述代码滤掉其中的空元素并非难事。