** JAVA8は新しい** - オプションクラスNPEの問題解決が特徴
** githubの詳細参照:**ます。https://github.com/java-open/jdk1.8-
APIの紹介
1、オプション(T値)、(空)の(T値)、ofNullable(T値)
(T値)の、
- 値が空である任意のオブジェクトを、構築機能(T値)を介して、依然としてNullPointerExceptionが報告しました。
- 値が、通常のコンフィギュレーションオプションのオブジェクトが空でない場合(T値)を介して機能のは、オプションのオブジェクトを構築しました。
ofNullable(T値)
値は(T値)で、nullの場合はNullPointerExceptionが報告します。ofNullable(T値)は例外をスローしません、ofNullable(T値)を直接バック対象にEMPTY
orElseとorElseGet
同等の値がNULLの場合、デフォルト値が与えられている:ユーザーの値がnullでない場合、関数は依然としてのcreateUser orElse()メソッドを実行するのcreateUser orElseGet()メソッドの機能を実行しません
public User createUser(){
User user = new User();
user.setName("zhangsan");
return user;
}
@Test public void test() {
User user = null;
user = Optional.ofNullable(user).orElse(createUser());
user = Optional.ofNullable(user).orElseGet(() -> createUser());
}
orElseThrow
値の引数がnullの場合、直接のスローは例外外の場合
User user = null;
Optional.ofNullable(user).orElseThrow(()->new Exception("用户不存在"));
マップ(関数<?スーパーT、?Uが伸びる>マッパー)和flatMap(機能<?スーパーT、オプション>マッパー)
二つの動作機能は、変換値を行います。
の点ではマップのための具体的な使用状況で:
ユーザー構造は以下の通りである場合:
public class User {
private String name;
public String getName() {
return name;
} }
それは次のように書かれた名前には時間がかかります
String city = Optional.ofNullable(user).map(u-> u.getName()).get();
flatMap用語の場合:
これは、ユーザー次のような構造である場合
public class User {
private String name;
public Optional<String> getName() {
return Optional.ofNullable(name);
}
}
それは次のように書かれた名前には時間がかかります
String city = Optional.ofNullable(user).flatMap(u-> u.getName()).get();
isPresent()和ifPresent(消費者<?スーパーT>消費者)
値がNULL値であり、その値はifPresentが空でないとき、何かを行うかどうか、であるisPresent。
図に示すようにifPresent(消費<?スーパーT>消費者)として、使用量は、非常に簡単です。
Optional.ofNullable(user).ifPresent(u->{
// TODO: do something
});
フィルタ(述語<?スーパーT>述語)
さもなければOptional.emptyと、条件に含まれる値は、このまたは任意に戻った場合、述語方法は、オプション含まれる値をフィルタリングするフィルタを受け付けます。
次のように使用法があります
Optional<User> user1 = Optional.ofNullable(user).filter(u -> u.getName().length()<6);
上述したように、ユーザ名の長さが6未満、その後リターンする場合。それが6以上である場合、およびEMPTYオブジェクトが返されます。
ユースケース
関数法で
以前に書かれました
public String getCity(User user) throws Exception{ if(user!=null){
if(user.getAddress()!=null){
Address address = user.getAddress(); if(address.getCity()!=null){
return address.getCity();
}
}
}
throw new Excpetion("取值错误");
}
JAVA8文言
public String getCity(User user) throws Exception{
return Optional.ofNullable(user)
.map(u-> u.getAddress())
.map(a->a.getCity())
.orElseThrow(()->new Exception("取指错误"));
}
一般的な方法
package com.example.demo;
import com.example.demo.entity.Employee;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.Optional;
/**
* Optional类测试
*/
@RunWith(SpringRunner.class)
@SpringBootTest
public class TestOptional {
/*
* Optional容器类的常用方法:
* of(T value):创建一个Optional实例
*/
@Test
public void test1() {
Optional<Employee> op = Optional.of(new Employee());
System.out.println(op.get());
}
/*
* empty():创建一个空的Optional实例
*/
@Test
public void test2() {
Optional<Employee> op = Optional.empty();
System.out.println(op.get());
}
/*
* ofNullable(T value):若T不为null,创建Optional实例,否则创建空实例
* isPresent():判断是否包含值
* orElse(T other):如果调用对象包含值,返回该值,否则返回other
* orElseGet(T other):如果调用对象包含值,返回该值,否则返回other获取的值
*/
@Test
public void test3() {
Optional<Employee> op = Optional.ofNullable(null);
// System.out.println(op.get());
System.out.println(op.isPresent());
Employee emp = op.orElse(new Employee("张三","公关"));
System.out.println(emp);
Employee emp1 = op.orElseGet(() -> new Employee());
System.out.println(emp1);
}
/*
* map(Function mapper):如果有值对其处理,并返回处理后的Optional,否则返回Optional.empty()
* flatMap(Function mapper):与map类似,要求返回值必须是Optional
*/
@Test
public void test4() {
Optional<Employee> op = Optional.ofNullable(new Employee("张三", "出台"));
Optional<String> str = op.map((e) -> e.getName());
System.out.println(str.get());
Optional<String> str1 = op.flatMap((e) -> Optional.of(e.getName()));
System.out.println(str1.get());
}
}
例二
例えば、メインプログラムで
以前に書かれました
IF(!ユーザー= NULL){doSomethingの(ユーザ)。}
JAVA8文言
Optional.ofNullable(ユーザ).ifPresent(U - > {()UがdoSomethingの;});