Java8 Дополнительное подробное объяснение

Java задняя часть Google

предисловие

Часто бывает такой опыт в работе: возвращаемое значение, полученное вызовом метода, может быть нулевым, и необходимо выполнить нулевое суждение, а потом сделать соответствующую бизнес-обработку или напрямую кинуть NullPointerException. Чтобы уменьшить такие суждения о нулевых значениях, java официально заимствует необязательный класс библиотеки классов Google guava и вводит необязательный класс с тем же именем в java8, Официальный javadoc описывает его следующим образом:

A container object which may or may not contain a non-null value. If a value is present, isPresent() will return true and get() will return the value.

В этой статье один за другим будут представлены методы, содержащиеся в классе Optional, и показано, как их использовать, на нескольких примерах:

of

Создайте необязательный параметр для значений, отличных от NULL.

Метод of создает необязательный экземпляр через фабричный метод.Следует отметить, что входящий параметр не может быть нулевым, иначе будет выброшено исключение NullPointerException.

// 给与一个非空值
Optional<String> username = Optional.of("cwl");
// 传入参数为null,抛出NullPointerException.
Optional<String> nullValue = Optional.of(null);

ofNullable

Создает необязательный элемент для указанного значения и возвращает пустой необязательный элемент, если указанное значение равно null. Обнуляемый Необязательный

// 下面创建了一个不包含任何值的Optional实例
// 输出Optional.empty
Optional empty = Optional.ofNullable(null);

isPresent

Возвращает true, если значение существует, иначе возвращает false
Аналогично следующему коду:

// isPresent方法用来检查Optional实例中是否包含值
if (username.isPresent()) {
    //在Optional实例内调用get()返回已存在的值
    System.out.println(username.get());      //输出cwl
}

get

Возвращает необязательный параметр, если он имеет значение, в противном случае генерирует исключение NoSuchElementException.

// 执行下面的代码抛出NoSuchElementException
try {
     // 在空的Optional实例上调用get()
     System.out.println(empty.get());
 } catch (NoSuchElementException ex) {
     System.out.println(ex.getMessage());         // 输出:No value present
}

ifPresent

Если необязательный экземпляр имеет значение, вызовите для него потребителя, в противном случае ничего не делайте.
Чтобы понять метод IFPREST, вы сначала должны пониматьПотребительский класс. Короче говоря, класс Consumer содержит абстрактный метод. Этот абстрактный метод работает с входящим значением, но не возвращает значение.Java8Поддержка прямого прохода без интерфейсалямбда-выражениеПередайте параметры.
Если экземпляр Optional имеет значение, вызов ifPresent() может принять сегмент интерфейса или лямбда-выражение. Аналогично следующему коду:

// ifPresent方法接受lambda表达式作为参数。
// lambda表达式对Optional的值调用consumer进行处理。
username.ifPresent((value) -> {
     System.out.println("The length of the value is: " + value.length());
});

orElse

Возвращает значение, если оно есть, в противном случае возвращает указанное другое значение.
Возвращает необязательный экземпляр, если он имеет значение, в противном случае возвращает параметр, переданный методом orElse. Пример выглядит следующим образом:

// 如果值不为null,orElse方法返回Optional实例的值,否则返回传入的消息
System.out.println(empty.orElse("There is no value present!"));// 输出:There is no value present!
System.out.println(username.orElse("There is some value!"));  // 输出:cwl

orElseGet

orElseGet аналогичен методу orElse, за исключением того, что получается значение по умолчанию. Метод orElse принимает входящую строку как значение по умолчанию, которое может принять метод orElseGet.Интерфейс поставщикаРеализация используется для генерации значений по умолчанию. Пример выглядит следующим образом:

// orElseGet与orElse方法类似,区别在于orElse传入的是默认值,
// orElseGet可以接受一个lambda表达式生成默认值。
// 输出:Default Value
System.out.println(empty.orElseGet(() -> "Default Value"));
// 输出:cwl
System.out.println(username.orElseGet(() -> "Default Value"));

orElseThrow

Возвращает его, если есть значение, в противном случае генерирует исключение, созданное интерфейсом поставщика.
В методе orElseGet мы передаемИнтерфейс поставщика. Однако в OralSethrow мы можем передать лямбда-выражение или метод, если значение не существует, чтобы вызвать исключение. Пример выглядит следующим образом:

try {
    // orElseThrow与orElse方法类似。与返回默认值不同,
    // orElseThrow会抛出lambda表达式或方法生成的异常
    empty.orElseThrow(ValueAbsentException::new);
} catch (Throwable ex) {
    //输出: No value present in the Optional instance
    System.out.println(ex.getMessage());
}

ValueAbsentException определяется следующим образом:

class ValueAbsentException extends Throwable {
     public ValueAbsentException() {
        super();
    }
    public ValueAbsentException(String msg) {
        super(msg);
    }
    @Override
    public String getMessage() {
       return "No value present in the Optional instance";
    }
}

map

Если есть значение, вызовите для него функцию сопоставления, чтобы получить возвращаемое значение. Если возвращаемое значение не равно null, создайте необязательный элемент, содержащий возвращаемое значение сопоставления в качестве возвращаемого значения метода сопоставления, в противном случае верните пустой необязательный элемент.
Метод карты используется для выполнения ряда операций со значением экземпляра Optional. Действия передаются через набор лямбда-выражений, реализующих интерфейс Function. Если вы не знакомы с интерфейсом функций, вы можете обратиться кэтот блог. Пример метода карты выглядит следующим образом:

// map方法执行传入的lambda表达式参数对Optional实例的值进行修改。
// 为lambda表达式的返回值创建新的Optional实例作为map方法的返回值。
Optional<String> upperName = username.map((value) -> value.toUpperCase());  
System.out.println(upperName.orElse("No value found"));      //输出: CWL

flatMap

Если есть значение, функция возвращает для своего типа сопоставления реализации необязательное возвращаемое значение, в противном случае возвращает пустое необязательное значение. Аналогичен методу карты flatMap (Funtion), за исключением того, что возвращаемое значение flatMap картографа должно быть необязательным. Конец вызова, flatMap не приведет к дополнительному пакету.
Что касается функции карты, пример, переписанный с использованием flatMap, выглядит следующим образом:

// flatMap与map(Function)非常类似,区别在于传入方法的lambda表达式的返回类型。
// map方法中的lambda表达式返回值可以是任意类型,在map函数返回之前会包装为Optional。 
// 但flatMap方法中的lambda表达式返回值必须是Optionl实例。 
 upperName = username.flatMap((value) -> Optional.of(value.toUpperCase()));
 System.out.println(upperName.orElse("No value found"));//输出 CWL

filter

Метод filter фильтрует значение экземпляра Optional, передавая квалификацию. Документация описывает это следующим образом:
Возвращает необязательный элемент, содержащий значение, если значение есть и выполняется условие предиката, в противном случае возвращает пустой необязательный элемент.
Читая это, вы, вероятно, уже знаете, как передать фрагмент кода в метод фильтра. Да, вы можете передать здесь лямбда-выражение. Для функции фильтра мы должны передать лямбда-выражение, реализующее интерфейс Predicate. Если вы не знакомы с интерфейсом Predicate, вы можете обратиться кэта статья.
Теперь я рассмотрю различные варианты использования filter.В следующем примере описываются два случая, когда квалификационные условия выполняются и условия не выполняются:

// filter方法检查给定的Option值是否满足某些条件。
// 如果满足则返回同一个Option实例,否则返回空Optional。
Optional<String> longName = username.filter((value) -> value.length() > 2);
System.out.println(longName.orElse("The name is less than 2 characters"));//cwl

// 另一个例子是Optional值不满足filter指定的条件。
Optional<String> anotherName = Optional.of("y");
Optional<String> shortName = anotherName.filter((value) -> value.length() > 2);
// 输出:The name is less than 2 characters
System.out.println(shortName.orElse("The name is less than 2 characters"));

Вышеприведенное является введением в использование каждого метода API по выбору.