java optional详解_java8中Optional的用法详解
package com.lyzx.concurrent.java8;
import org.junit.Test;
import java.util.Optional;
import java.util.Random;
public class OptionalTest {
/**
* Optional.of(T t)创建一个Optional
* >> 底层有一个泛型T的value,如果t不是null就赋值给value
* isPresent()判断是否存在
* >> return value != null
* get() 获取泛型T的实例t
* >>如果value != null 就返回value,否则抛出异常
* Optional.empty()返回一个空Optional对象
*
*/
@Test
public void test1(){
Optional op1 = Optional.of(new Java8("first"));
System.out.println(op1.get()+" "+op1.isPresent());
Optional op2 = Optional.empty();
System.out.println(op2.isPresent()+" "+ op2.get());
}
/**
* Optional.ofNullable(T t)
* >> return value == null ? empty() : of(value)
*
*/
@Test
public void test2(){
// Optional op1 = Optional.ofNullable(new Java8("王二狗"));
Java8 j = null;
Optional op1 = Optional.ofNullable(j);
System.out.println(op1.isPresent()+" "+op1.isPresent());
System.out.println(op1.orElse(new Java8("李铁蛋")));
}
/**
* orElseGet(fun) 如果isPresent()==false 通过一个函数生成一个泛型T的对象t
*/
@Test
public void test3(){
Java8 j = null;//new Java8("AA");//null;
Optional op1 = Optional.ofNullable(j);
Java8 j2 = op1.orElseGet(()->{
String[] arr = {"王大锤","张铁蛋","大球娃"};
Random rand = new Random();
return new Java8(arr[rand.nextInt(arr.length)]);
});
System.out.println(j2);
}
@Test
public void test4(){
Man man = new Man("余承东",new TargetPhone("P20 Pro"));
String phoneName = TralditionalMethod(man);
System.out.println(phoneName);
System.out.println(TralditionalMethod(null));
}
/**
* 通过传统的方式获取一个嵌套对象中的属性
* 需要不停的判断某个属性是否为null
* @param man
* @return
*/
public String TralditionalMethod(Man man){
if(null != man){
TargetPhone phone = man.getPhone();
if(null != phone){
String phoneName = phone.getPhoneName();
return phoneName;
}
}
return "小米Mix2S";
}
@Test
public void test5(){
// XMan xman = new XMan("罗永浩",Optional.of(new TargetPhone("锤子T3")));
// Optional op = Optional.ofNullable(xman);
Optional op = Optional.empty();
System.out.println(newMethod(op));
}
/**
* 通过新方式获取某个属性的值,
* 需要改造类的属性,把其有可能出现null的属性封装为Optional
* @param man
* @return
*/
public String newMethod(Optional man){
return man.orElse(new XMan("雷军",Optional.of(new TargetPhone("小米Mix2S"))))
.getPhone()
.get()
.getPhoneName();
}
/**
* 测试 ifPresent 方法
* 只有在op不为空时才执行,为空是不执行
*/
@Test
public void test6(){
String data = null;//"1,2,3";
Optional op = Optional.ofNullable(data);
op.ifPresent(x->{
for(String v : x.split(",")){
System.out.println("--"+v);
}
});
if(op.isPresent())
System.out.println(op.get());
}
/**
* orElse()和orElseGet()方法都是op不为空时返回get()的值,为空时返回参数里面的值
* 不同点在于
* orElse()方法op是不是为空,都会执行参数参入的方法
* orElseGet()方法在对象不为空时直接返回get()的值
*
* orElseThrow()当op为空时直接抛出异常
*/
@Test
public void test7(){
String data = null;
// String data = "youzhi";
Optional op = Optional.ofNullable(data);
String other = op.orElse(getStr());
System.out.println("1:"+other);
System.out.println("===================");
String elseGet = op.orElseGet(()->getStr());
System.out.println("2:"+elseGet);
op.orElseThrow(()->new IllegalArgumentException("参数为空"));
}
public String getStr(){
System.out.println("getStr()被调用......");
return "getStrValue";
}
/**
* map()和flatMap()方法在不为空时调用
*/
@Test
public void test8(){
Man man = new Man("提姆库克",new TargetPhone("iphoneX"));
// Man man = null;
Optional op = Optional.ofNullable(man);
String ss = op.map(x -> x.getManName()).orElseGet(() -> "默认值");
System.out.println(ss);
TargetPhone t3 = op.map(x -> x.getPhone()).orElseGet(() -> new TargetPhone("T3"));
System.out.println(t3.getPhoneName());
}
/**
* Optional的常用方法举例
* 这样做比较好的是看着很清爽而且没有烦人的空指针异常
*/
@Test
public void test9(){
// Man man = new Man("提姆库克",new TargetPhone("iphoneX"));
Man man = null;
Optional op = Optional.ofNullable(man);
String iphoneName = op.map(x->x.getPhone())
.map(x->x.getPhoneName())
.orElse("默认值");
System.out.println(iphoneName);
}
/**
* filter的过滤作用
*/
@Test
public void test10(){
Man man = new Man("提姆库克",new TargetPhone("iphoneX"));
Optional op = Optional.ofNullable(man);
Optional phone = op.map(x -> x.getPhone())
.filter(x -> x.getPhoneName().length() > 5);
System.out.println(phone.orElse(new TargetPhone("最好的战斗机")).getPhoneName());
}
}
class Java8{
private String name;
public Java8(String name){
this.name = name;
}
@Override
public String toString() {
return "Java8{" +
"name='" + name + '\'' +
'}';
}
}
class Man{
private String manName;
private TargetPhone phone;
public Man(String manName,TargetPhone phone){
this.manName=manName;
this.phone = phone;
}
public String getManName() {
return manName;
}
public TargetPhone getPhone() {
return phone;
}
@Override
public String toString() {
return "Man{" +
"manName='" + manName + '\'' +
", phone=" + phone +
'}';
}
}
class TargetPhone{
private String phoneName;
public TargetPhone(String phoneName){
this.phoneName = phoneName;
}
public String getPhoneName(){
return phoneName;
}
}
class XMan{
private String manName;
private Optional phone;
public XMan(String manName,Optional phone){
this.manName = manName;
this.phone = phone;
}
public String getManName() {
return manName;
}
public Optional getPhone() {
return phone;
}
@Override
public String toString() {
return "XMan{" +
"manName='" + manName + '\'' +
", phone=" + phone +
'}';
}
}
java optional详解_java8中Optional的用法详解相关推荐
- java中instanceof 详解_java中的instanceof用法详解
instanceof是Java的一个二元操作符(运算符),也是Java的保留关键字.它的作用是判断其左边对象是否为其右边类的实例,返回的是boolean类型的数据.用它来判断某个对象是否是某个Clas ...
- html5标签详解,HTML5中figcaption标签用法详解
HTML5中figure和figcaption标签一般都是配套使用的,先了解下两者的基本定义,然后结合实例来说明两者的用法. 标签规定独立的流内容(图像.图表.照片.代码等等). figure元素的内 ...
- php simplexml_load_file 详解,php中simplexml_load_file函数用法实例讲解
php中simplexml_load_file函数用法实例讲解 发布于 2015-02-07 06:53:40 | 136 次阅读 | 评论: 0 | 来源: 网友投递 PHP开源脚本语言PHP(外文 ...
- java中throws用法_java中throws实例用法详解
在程序出现异常时,会有一个抛出异常的throw出现,这里我们要跟今天所讲的throws区分开.throws的作用是声明抛出,在名称上也跟throw有所不同.下面我们就throws对策概念.语法.实例带 ...
- JSP 中EL表达式用法详解
EL 全名为Expression Language EL 语法很简单,它最大的特点就是使用上很方便.接下来介绍EL主要的语法结构: ${sessionScope.user.sex} 所有EL都是以${ ...
- html nthchild作用,详解CSS中:nth-child的用法
前端的哥们想必都接触过css中一个神奇的玩意,可以轻松选取你想要的标签并给与修改添加样式,是不是很给力,它就是":nth-child". 下面我将用几个典型的实例来给大家讲解:nt ...
- python中permute_PyTorch中permute的用法详解
PyTorch中permute的用法详解 permute(dims) 将tensor的维度换位. 参数:参数是一系列的整数,代表原来张量的维度.比如三维就有0,1,2这些dimension. 例: i ...
- C++中substr()函数用法详解
C++中substr()函数用法详解 原型: string substr (size_t pos = 0, size_t len = npos) const; 返回一个新构造的string对象,其值初 ...
- c++中vector的用法详解
c++中vector的用法详解 vector(向量): C++中的一种数据结构,确切的说是一个类.它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间 ...
最新文章
- 械模拟计算器 - 计算尺
- 使用Physics_Body_Editor获得json文件的类
- DL之VGG16:基于VGG16(Keras)利用Knifey-Spoony数据集对网络架构进行迁移学习
- php开发ftp服务器搭建教程,在Linux中搭建一个FTP服务器
- C#窗体中的textBox怎么设置为密码框
- 翻译SSD论文(Single Shot MultiBox Detector)
- 数据挖掘之关联分析六(子图模式)
- foreach数组循环结构体
- 23种设计模式之工厂方法模式
- 分久必合的Lindorm传奇
- 微信公开课讲师黄咪咪:熟读规则,玩转小游戏
- 使用内存映射文件来共享数据
- redirect与forward跳转的区别
- win32汇编实现一个简单的TCP服务端程序(WinSock的简单认知应用)
- DSP2812和28335的区别
- 【CSS 字体 属性(Font)】
- 大学娱乐化值得高度警惕——胡乐乐
- 2017 终点亦是起点
- php websocket通信
- 家装灯线走线图_二十年资深装修电工是如何布线的?家庭装修电工布线图详解...