> Java > java지도 시간 > 본문

Java 8의 새로운 기능인 Optional 클래스

黄舟
풀어 주다: 2017-02-23 10:30:32
원래의
1835명이 탐색했습니다.

요약: Optional은 null 키워드를 대체하지는 않지만 null 판단을 보다 우아하게 구현합니다.

NullPointException은 Java에서 시도했지만 모든 Java 프로그래머가 경험한 예외라고 할 수 있습니다. 프로그래머를 설계 초기부터 포인터의 고통으로부터 해방시키기 위해 포인터는 실제로 존재하며, Java 디자이너는 Java 언어에서 포인터를 더 간단하고 사용하기 쉽게 만들 수 있을 뿐 완전히 없앨 수는 없으므로 아아아

우리가 매일 보는 것.


널 포인터 예외는 런타임 예외입니다. 이러한 예외 유형의 경우 명확한 처리 전략이 없으면 프로그램을 조기에 중단시키는 것이 가장 좋습니다. 그러나 많은 시나리오에서 개발자는 그렇게 하지 않습니다. 특정 처리 전략이 있지만 널 포인터 예외의 존재를 전혀 인식하지 못합니다. 예외가 발생하면 처리 전략도 매우 간단합니다. 예외가 존재하는 곳에 if 문 판단을 추가하면 됩니다. 그러나 이러한 응답 전략은 우리 프로그램에 점점 더 많은 null 판단이 나타나게 할 것입니다. 코드에서 null 키워드의 발생을 최소화해야 하며, java8에서 제공하는

null
로그인 후 복사
로그인 후 복사

클래스는 NullPointException을 줄일 뿐만 아니라 코드의 아름다움을 향상시킵니다. 하지만 먼저 이것이
Optional
로그인 후 복사
키워드를 대체하는 것이 아니라 NullPointException

을 방지하기 위해 보다 우아한 null 결정 구현을 제공한다는 점을 분명히 해야 합니다.

1. 직관적인 경험

타사 도구 클래스를 사용하지 않는 경우 <를 호출해야 한다고 가정해 보겠습니다. 🎜>
null
로그인 후 복사
로그인 후 복사

메서드:

if(null == str) { // Null 포인터 결정

return 0;
}
return str.length();
Optional 클래스를 사용하는 경우 다음과 같이 구현합니다.

return Optional.ofNullable(str).map(String::length).orElse(0);
Optional 코드가 상대적으로 간결할 때. 코드가 크면 쉽게 잊어버릴 수 있지만 Optional 클래스를 사용하면 이러한 문제를 피할 수 있습니다.



2. 기본 사용법

1. 객체 생성

빈 객체 생성

선택위의 예제 코드는

str.length()
로그인 후 복사

메소드를 호출하여 빈
empty()
로그인 후 복사

객체 유형을 생성합니다.

객체 생성: null은 허용되지 않습니다.

Optional은 null이 아닌 객체를 생성하기 위한

Optional<String>
로그인 후 복사

메소드를 제공합니다. 이 메소드에는 전달된 매개변수가 필요합니다. 비어 있을 수 없습니다. 그렇지 않으면

Optional<String> optStr = Optional.of(str); 🎜>

객체 생성: 비어 있음


전달된 매개변수에 null 값이 발생할 가능성이 있는지 확실하지 않은 경우 Optional의 <를 사용할 수 있습니다. 🎜>

of()
로그인 후 복사

객체 생성 메소드, 입력 매개변수가 null이면 빈 객체가 생성됩니다. 예는 다음과 같습니다.
Optional<String> optStr = Optional.ofNullable(str); // str이 null인 경우 빈 객체를 생성합니다

2. 🎜 >

스트리밍 처리는 Java8이 제공하는 새로운 강력한 기능으로, 컬렉션 작업을 더욱 간결하고 효율적으로 만들어줍니다. Java8의 새로운 기능에 대한 다음 기사에서는 이탈 처리에 대해 포괄적으로 소개합니다. 여기에서는 선택 사항으로 매핑과 필터링이라는 두 가지 기본 이탈 처리도 제공합니다.


시연을 위해 다음과 같이

NullPointException
로그인 후 복사

클래스를 설계했습니다.

ofNullable()
로그인 후 복사

사람에게는 휴대폰과 이메일이 필요하지 않으므로 선택적 정의를 사용하십시오.

매핑: map 및 flatMap



매핑은 입력을 다른 형태의 출력으로 변환하는 작업입니다. 예를 들어 이전 예에서는 문자열을 입력하고 출력합니다. 는 문자열의 길이로, 이를 달성하기 위해

User
로그인 후 복사

메서드를 사용합니다. 사람의 이름을 얻고 싶다고 가정하면 다음과 같이 구현할 수 있습니다.
String name = Optional.ofNullable(user).map(User::getName).orElse("no name"); 이렇게 하면 입력 매개변수 user가 비어 있지 않으면 해당 이름이 반환되고, 그렇지 않으면
/**
 * @author: zhenchao.Wang 2016-9-24 15:36:56
 */
public class User {
    /** 用户编号 */
    private long id;
    private String name;
    private int age;
    private Optional phone;
    private Optional<String> email;
    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }
    // 省略setter和getter
}
로그인 후 복사

가 반환됩니다. 위의 방법으로 전화나 이메일을 받으려면 위의 방법을 사용하세요. 이는 Optional 이후에 반환되기 때문에 작동하지 않습니다. 우리는 이것을 Optional 중첩이라고 부릅니다. 원하는 결과를 얻으려면 한 번만 매핑해야 합니다:

longphone = optUser.map(User::getPhone). map(Optional: :get).orElse(-1L);

실제로 현재로서는 flatMap을 사용하여 한 단계로 원하는 결과를 얻는 것이 더 좋은 방법입니다.

longphone = optUser.FlatMap(User:: getPhone).orElse(-1L);
flapMap은 메서드에서 반환된 각 스트림을 하나의 스트림으로 평면화할 수 있습니다. 이에 대해서는 스트림 처리에 관한 다음 문서에서 자세히 설명합니다.


Filter: filterer


filiter는 이름에서 알 수 있듯이 필터링 작업을 이 메서드에 매개변수로 전달하여 다음의 목적을 달성할 수 있습니다. 필터링 원하는 내용을 추가하세요. 18세 이상의 성인을 필터링하려면 다음을 수행할 수 있습니다.


map()
로그인 후 복사

3. 기본 동작
Optional이 조건을 충족하지 않는 경우 위의 예에서 사용한
과 같은 작업을 수행합니다.
orElse()
로그인 후 복사

就是一个默认操作,用于在Optional对象为空时执行特定操作,当然也有一些默认操作是当满足条件的对象存在时执行的操作。

get()

get用于获取变量的值,但是当变量不存在时则会抛出

NoSuchElementException
로그인 후 복사

,所以如果不确定变量是否存在,则不建议使用

orElse(T other)

当Optional的变量不满足给定条件时,则执行orElse,比如前面当str为null时,返回0。

orElseGet(Supplier<? extends X> expectionSupplier)
로그인 후 복사

如果条件不成立时,需要执行相对复杂的逻辑,而不是简单的返回操作,则可以使用orElseGet实现:

long phone = optUser.map(User::getPhone).map(Optional::get).orElseGet(() -> {
    // do something here
    return -1L;
});
orElseThrow(Supplier<? extends X> expectionSupplier)
로그인 후 복사

与get()方法类似,都是在不满足条件时返回异常,不过这里我们可以指定返回的异常类型。

ifPresent(Consumer)

当满足条件时执行传入的参数化操作。

三. 注意事项

Optional是一个final类,未实现任何接口,所以当我们在利用该类包装定义类的属性的时候,如果我们定义的类有序列化的需求,那么因为Optional没有实现Serializable接口,这个时候执行序列化操作就会有问题:

public class User implements Serializable{
    /** 用户编号 */
    private long id;
    private String name;
    private int age;
    private Optional phone;  // 不能序列化
    private Optional<String> email;  // 不能序列化
로그인 후 복사

不过我们可以采用如下替换策略:

private long phone;
public Optional<Long> getPhone() {
    return Optional.ofNullable(this.phone);
}
로그인 후 복사

看来Optional在设计的时候就没有考虑将它作为类的字段使用~

 以上就是Java8 新特性之 Optional 类 的内容,更多相关内容请关注PHP中文网(www.php.cn)!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!