Contents

Java 9 中Objects简介

1. 简介

java.util.Objects类自 1.7 版以来一直是 Java 的一部分。此类为对象提供静态实用方法,可用于执行一些日常任务,例如检查相等性、null检查等。

在本文中,我们将了解Java 9中 java.util.Objects类中引入的新方法。

2. requireNonNullElse方法

此方法接受两个参数,如果不为null则返回第一个参数,否则返回第二个参数。如果两个参数都是null,则抛出NullPointerException

private List<String> aMethodReturningNullList(){
    return null;
}
@Test
public void givenNullObject_whenRequireNonNullElse_thenElse() {
    List<String> aList = Objects.<List>requireNonNullElse(
      aMethodReturningNullList(), Collections.EMPTY_LIST);
 
    assertThat(aList, is(Collections.EMPTY_LIST));
}
private List<String> aMethodReturningNonNullList() {
    return List.of("item1", "item2");
}
@Test
public void givenObject_whenRequireNonNullElse_thenObject() {
    List<String> aList = Objects.<List>requireNonNullElse(
      aMethodReturningNonNullList(), Collections.EMPTY_LIST);
 
    assertThat(aList, is(List.of("item1", "item2")));
}
@Test(expected = NullPointerException.class)
public void givenNull_whenRequireNonNullElse_thenException() {
    Objects.<List>requireNonNullElse(null, null);
}

3. 使用requireNonNullElseGet

此方法类似于requireNonNullElse,除了**第二个参数是java.util.function.Supplier接口,它允许对提供的集合进行延迟实例化。**Supplier实现负责返回一个非空对象,如下所示:

@Test
public void givenObject_whenRequireNonNullElseGet_thenObject() {
    List<String> aList = Objects.<List>requireNonNullElseGet(
      null, List::of);
    assertThat(aList, is(List.of()));
}

4. 使用checkIndex

此方法用于检查索引是否在给定长度内。如果0 <= index < length则返回索引。否则,它会引发IndexOutOfBoundsException,如下所示:

@Test
public void givenNumber_whenInvokeCheckIndex_thenNumber() {
    int length = 5;
 
    assertThat(Objects.checkIndex(4, length), is(4));
}
@Test(expected = IndexOutOfBoundsException.class)
public void givenOutOfRangeNumber_whenInvokeCheckIndex_thenException() {
    int length = 5;
    Objects.checkIndex(5, length);
}

5. 使用checkFromToIndex

此方法用于检查*[fromIndex, toIndex)形成的给定子范围是否在[0, length)*形成的范围内。如果子范围有效,则返回下限,如下所示:

@Test
public void givenSubRange_whenCheckFromToIndex_thenNumber() {
    int length = 6;
 
    assertThat(Objects.checkFromToIndex(2,length,length), is(2));
}
@Test(expected = IndexOutOfBoundsException.class)
public void givenInvalidSubRange_whenCheckFromToIndex_thenException() {
    int length = 6;
    Objects.checkFromToIndex(2,7,length);
}

注:在数学中,以[a, b)形式表示的范围表示该范围包含a,不包含b。[ 和 ] 表示包含该数字,而 ( and ) 表示排除该数字。

6. 使用checkFromIndexSize

此方法与checkFromToIndex类似,只是我们提供子范围的大小和下限,而不是提供子范围的上限。 在这种情况下,子范围是*[fromIndex, fromIndex + size)并且此方法检查子范围是否在[0, length)*形成的范围内:

@Test
public void givenSubRange_whenCheckFromIndexSize_thenNumber() {
    int length = 6;
 
    assertThat(Objects.checkFromIndexSize(2,3,length), is(2));
}
@Test(expected = IndexOutOfBoundsException.class)
public void givenInvalidSubRange_whenCheckFromIndexSize_thenException() {
    int length = 6;
    Objects.checkFromIndexSize(2, 6, length);
}