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的用法详解相关推荐

  1. java中instanceof 详解_java中的instanceof用法详解

    instanceof是Java的一个二元操作符(运算符),也是Java的保留关键字.它的作用是判断其左边对象是否为其右边类的实例,返回的是boolean类型的数据.用它来判断某个对象是否是某个Clas ...

  2. html5标签详解,HTML5中figcaption标签用法详解

    HTML5中figure和figcaption标签一般都是配套使用的,先了解下两者的基本定义,然后结合实例来说明两者的用法. 标签规定独立的流内容(图像.图表.照片.代码等等). figure元素的内 ...

  3. php simplexml_load_file 详解,php中simplexml_load_file函数用法实例讲解

    php中simplexml_load_file函数用法实例讲解 发布于 2015-02-07 06:53:40 | 136 次阅读 | 评论: 0 | 来源: 网友投递 PHP开源脚本语言PHP(外文 ...

  4. java中throws用法_java中throws实例用法详解

    在程序出现异常时,会有一个抛出异常的throw出现,这里我们要跟今天所讲的throws区分开.throws的作用是声明抛出,在名称上也跟throw有所不同.下面我们就throws对策概念.语法.实例带 ...

  5. JSP 中EL表达式用法详解

    EL 全名为Expression Language EL 语法很简单,它最大的特点就是使用上很方便.接下来介绍EL主要的语法结构: ${sessionScope.user.sex} 所有EL都是以${ ...

  6. html nthchild作用,详解CSS中:nth-child的用法

    前端的哥们想必都接触过css中一个神奇的玩意,可以轻松选取你想要的标签并给与修改添加样式,是不是很给力,它就是":nth-child". 下面我将用几个典型的实例来给大家讲解:nt ...

  7. python中permute_PyTorch中permute的用法详解

    PyTorch中permute的用法详解 permute(dims) 将tensor的维度换位. 参数:参数是一系列的整数,代表原来张量的维度.比如三维就有0,1,2这些dimension. 例: i ...

  8. C++中substr()函数用法详解

    C++中substr()函数用法详解 原型: string substr (size_t pos = 0, size_t len = npos) const; 返回一个新构造的string对象,其值初 ...

  9. c++中vector的用法详解

    c++中vector的用法详解 vector(向量): C++中的一种数据结构,确切的说是一个类.它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间 ...

最新文章

  1. 械模拟计算器 - 计算尺
  2. 使用Physics_Body_Editor获得json文件的类
  3. DL之VGG16:基于VGG16(Keras)利用Knifey-Spoony数据集对网络架构进行迁移学习
  4. php开发ftp服务器搭建教程,在Linux中搭建一个FTP服务器
  5. C#窗体中的textBox怎么设置为密码框
  6. 翻译SSD论文(Single Shot MultiBox Detector)
  7. 数据挖掘之关联分析六(子图模式)
  8. foreach数组循环结构体
  9. 23种设计模式之工厂方法模式
  10. 分久必合的Lindorm传奇
  11. 微信公开课讲师黄咪咪:熟读规则,玩转小游戏
  12. 使用内存映射文件来共享数据
  13. redirect与forward跳转的区别
  14. win32汇编实现一个简单的TCP服务端程序(WinSock的简单认知应用)
  15. DSP2812和28335的区别
  16. 【CSS 字体 属性(Font)】
  17. 大学娱乐化值得高度警惕——胡乐乐
  18. 2017 终点亦是起点
  19. php websocket通信
  20. 家装灯线走线图_二十年资深装修电工是如何布线的?家庭装修电工布线图详解...

热门文章

  1. 如何把sql文件导入到phpMyadmin数据库
  2. Kaggle猫狗大战升级版VGG16处理
  3. 静默删除oracle,静默安装卸载 ORACLE
  4. android中PAG的简单使用
  5. 【CC++】分支结构(判断一年中的第几天)
  6. SpringBoot -> 国际化(i18n)
  7. 什么是hashCode?
  8. 源码级调试的XNU内核
  9. 人工智能顶会AAAI第一轮审稿结果出炉,却引发大量吐槽!
  10. 16-PHP代码审计——Typecho1.0.14反序列化漏洞