요약: Optional은 null 키워드를 대체하지는 않지만 null 판단을 보다 우아하게 구현합니다.
NullPointException은 Java에서 시도했지만 모든 Java 프로그래머가 경험한 예외라고 할 수 있습니다. 프로그래머를 설계 초기부터 포인터의 고통으로부터 해방시키기 위해 포인터는 실제로 존재하며, Java 디자이너는 Java 언어에서 포인터를 더 간단하고 사용하기 쉽게 만들 수 있을 뿐 완전히 없앨 수는 없으므로 아아아
널 포인터 예외는 런타임 예외입니다. 이러한 예외 유형의 경우 명확한 처리 전략이 없으면 프로그램을 조기에 중단시키는 것이 가장 좋습니다. 그러나 많은 시나리오에서 개발자는 그렇게 하지 않습니다. 특정 처리 전략이 있지만 널 포인터 예외의 존재를 전혀 인식하지 못합니다. 예외가 발생하면 처리 전략도 매우 간단합니다. 예외가 존재하는 곳에 if 문 판단을 추가하면 됩니다. 그러나 이러한 응답 전략은 우리 프로그램에 점점 더 많은 null 판단이 나타나게 할 것입니다. 코드에서 null 키워드의 발생을 최소화해야 하며, java8에서 제공하는
null
Optional
을 방지하기 위해 보다 우아한 null 결정 구현을 제공한다는 점을 분명히 해야 합니다.
1. 직관적인 경험
null
return 0;
}
return str.length();
Optional 클래스를 사용하는 경우 다음과 같이 구현합니다.
return Optional.ofNullable(str).map(String::length).orElse(0);
Optional 코드가 상대적으로 간결할 때. 코드가 크면 쉽게 잊어버릴 수 있지만 Optional 클래스를 사용하면 이러한 문제를 피할 수 있습니다.
2. 기본 사용법
선택str.length()
메소드를 호출하여 빈 empty()
객체 생성: null은 허용되지 않습니다.
Optional은 null이 아닌 객체를 생성하기 위한
Optional<String>
객체 생성: 비어 있음
전달된 매개변수에 null 값이 발생할 가능성이 있는지 확실하지 않은 경우 Optional의 <를 사용할 수 있습니다. 🎜>
of()
시연을 위해 다음과 같이
NullPointException
ofNullable()
사람에게는 휴대폰과 이메일이 필요하지 않으므로 선택적 정의를 사용하십시오.
매핑은 입력을 다른 형태의 출력으로 변환하는 작업입니다. 예를 들어 이전 예에서는 문자열을 입력하고 출력합니다. 는 문자열의 길이로, 이를 달성하기 위해
User
/** * @author: zhenchao.Wang 2016-9-24 15:36:56 */ public class User { /** 用户编号 */ private long id; private String name; private int age; private Optionalphone; private Optional<String> email; public User(String name, int age) { this.name = name; this.age = age; } // 省略setter和getter }
실제로 현재로서는 flatMap을 사용하여 한 단계로 원하는 결과를 얻는 것이 더 좋은 방법입니다.
longphone = optUser.FlatMap(User:: getPhone).orElse(-1L);
flapMap은 메서드에서 반환된 각 스트림을 하나의 스트림으로 평면화할 수 있습니다. 이에 대해서는 스트림 처리에 관한 다음 문서에서 자세히 설명합니다.
Filter: filterer
filiter는 이름에서 알 수 있듯이 필터링 작업을 이 메서드에 매개변수로 전달하여 다음의 목적을 달성할 수 있습니다. 필터링 원하는 내용을 추가하세요. 18세 이상의 성인을 필터링하려면 다음을 수행할 수 있습니다.
map()
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 super T>)
当满足条件时执行传入的参数化操作。
Optional是一个final类,未实现任何接口,所以当我们在利用该类包装定义类的属性的时候,如果我们定义的类有序列化的需求,那么因为Optional没有实现Serializable接口,这个时候执行序列化操作就会有问题:
public class User implements Serializable{ /** 用户编号 */ private long id; private String name; private int age; private Optionalphone; // 不能序列化 private Optional<String> email; // 不能序列化
不过我们可以采用如下替换策略:
private long phone; public Optional<Long> getPhone() { return Optional.ofNullable(this.phone); }
看来Optional在设计的时候就没有考虑将它作为类的字段使用~
以上就是Java8 新特性之 Optional 类 的内容,更多相关内容请关注PHP中文网(www.php.cn)!