package jdk180reduce;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional; import test.Teacher;
import test.User; public class optional { /**
* 1.Optional的用法,可以,用了reduce计算,也可以不判断非null
* 2.三个方法:Optional.empty(), Optional.of, Optional.ofNullable
* 3.orElse()用法
* 4.ifPresent()区别isPresent()
* 5.orElse和orElseGet()不同*/
public static void main(String[] args) { emptyOptional();
orelse();
orelseDifferent();
whenMap_thenOk(); List<Student> stuList = new ArrayList<>(4);
stuList.add(new Student("刘一", 59));
stuList.add(new Student("陈二", 58));
stuList.add(new Student("张三", 98));
stuList.add(new Student("吴九", 100)); //计算分数在60分一下的分数总和 注意:以前没有60分以下的,不加判断就会出现空指针异常: score.orElse(0)= 有值取值,无值为0
Optional<Integer> score = stuList.stream().map(Student :: getScore).filter(s -> s<60).reduce((a,b) -> a+b);
System.out.println("score="+score.orElse(0)); // Map<Integer,String> map = new HashMap<>();
map.put(20180001,"章子");
map.put(20180002,"小米");
map.put(20180003,"大黄"); String name = Optional.ofNullable(map.get(20180001)).orElse("无");
System.out.println(name); //无 } public static void emptyOptional() {
// 以下会导致空指针:No value present
// Optional<User> emptyOpt = Optional.empty();
// emptyOpt.get(); //当用.of的时候必须不为null,否则也会报空指针
User user = new User();
Optional<User> opt = Optional.of(user);
opt.get(); //如果不确定传入的值是否为null,用ofNullable
Object opf = Optional.ofNullable(null).orElse("null");
System.out.println(opf); //ofNullable方法也要isPresent判断是否有值,或者用.orElse赋值
String name = "John";
Optional<String> opu = Optional.ofNullable(null);
if (opu.isPresent()) {
System.out.println(opu.get());
} else {
System.out.println("opu无值");
} //ifPresent区别isPresent,是用labam表达式
Optional<String> opp = Optional.ofNullable(name);
opp.ifPresent(it -> System.out.println(opp.get()));
} public static void orelse() { //orElse:如果有值则返回该值user,否则返回传递给它的参数值user2:
User user = null;
User user2 = new User();
user2.setUserId(2);
User result = Optional.ofNullable(user).orElse(user2);
System.out.println("result="+result);
} /**
* orElse和orElseGet()不同
*/
public static void orelseDifferent() { User user = null;
System.out.println("1----Using orElse");
User result = Optional.ofNullable(user).orElse(createNewUser());
System.out.println("1----Using orElseGet");
User result2 = Optional.ofNullable(user).orElseGet(() -> createNewUser()); User user4 = new User();
user4.setAge(2);
System.out.println("2----Using orElse");
User result4 = Optional.ofNullable(user4).orElse(createNewUser());
System.out.println("result4====="+result4); System.out.println("2----Using orElseGet");
User result3 = Optional.ofNullable(user4).orElseGet(() -> createNewUser());
System.out.println("result3===="+result3); //结论:两个 Optional对象都包含非空值,两个方法都会返回对应的非空值。
//不过,orElse() 方法仍然创建了 User 对象。 与之相反,orElseGet() 方法不创建 User 对象。
//在执行较密集的调用时,比如调用 Web 服务或数据查询,这个差异会对性能产生重大影响。
} private static User createNewUser() {
System.out.println("Creating New User");
User user = new User();
user.setName("java");
return user;
} public static void whenMap_thenOk() {
User user = createNewUser();
User userNull = new User();
String name = Optional.ofNullable(user).map(u -> u.getName()).orElse("vivi");
Optional<User> result = Optional.ofNullable(user).filter(u -> u.getName() != null && u.getName().contains("li"));
result.ifPresent(u -> {
String myName = result.get().getName();
//-------------
System.out.println("过滤值:" + result.get().getName());
}); //第二种:
if (result.isPresent()) {
System.out.println("过滤值2:" + result.get().getName());
}
} }

java8 Optional 类的更多相关文章

  1. Java8 Optional类

    概述 到目前为止,著名的NullPointerException是导致Java应用程序失败的最常见原因.过去,为了解决空指针异常,Google公司著名的Guava项目引入了Optional类,Guav ...

  2. 详解Java8 Optional类{最全}

    1:Optional 1.1 概述 Optional 类主要解决的问题是臭名昭著的空指针异常(NullPointerException),提供了一些的方法代替过去的if-else处理逻辑,并与Stre ...

  3. Java8 Optional类使用小结

    Optional类的Javadoc描述如下: 这是一个可以为null的容器对象.如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象. of:  为非null的值创建一 ...

  4. Java8 Optional的简单操作

    我们经常会遇到这种情况:首先判断一个对象是否为null,如果不为null,获取一个对象中的一个属性,如果该属性不为null,又获取该属性的属性,如果该属性的属性不为null,又获取属性的属性的属性: ...

  5. 【Todo】Java学习笔记 100==100 & Reflection API & Optional类详解 & DIP、IoC、DI & token/cookie/session管理会话方式

    为什么1000 == 1000返回为False,而100 == 100会返回为True?   Link Java Reflection API:Link Java8 Optional 类深度解析: L ...

  6. Java8之Optional类

    写在前头 今天再看阿里的Java开发手册,里面异常处理第10条提到这样一个建议. [推荐]防止 NPE ,是程序员的基本修养,注意 NPE 产生的场景:1 ) 返回类型为基本数据类型,return 包 ...

  7. java8新特性之Optional类

    NullPointException可以说是所有java程序员都遇到过的一个异常,虽然java从设计之初就力图让程序员脱离指针的苦海,但是指针确实是实际存在的,而java设计者也只能是让指针在java ...

  8. Java8新特性之空指针异常的克星Optional类

    Java8新特性系列我们已经介绍了Stream.Lambda表达式.DateTime日期时间处理,最后以"NullPointerException" 的克星Optional类的讲解 ...

  9. Java8系列 (五) Optional类

    概述 在Java8之前, 如果需要对一个变量做一次 null 检查, 通常会像下面这样写 T t = service1.query(); if (t != null) { K k = service2 ...

随机推荐

  1. 离散数学 II(最全面的知识点汇总)

    离散数学 II(知识点汇总) 目录 离散数学 II(知识点汇总) 代数系统 代数系统定义 例子 二元运算定义 运算及其性质 二元运算的性质 封闭性 可交换性 可结合性 可分配性 吸收律 等幂性 消去律 ...

  2. 一篇文章讲透Dijkstra最短路径算法

    Dijkstra是典型最短路径算法,计算一个起始节点到路径中其他所有节点的最短路径的算法和思想.在一些专业课程中如数据结构,图论,运筹学等都有介绍.其思想是一种基础的求最短路径的算法,通过基础思想的变 ...

  3. jchdl - GSL实例 - Mul(无符号数的乘法)

      这里实现最原始的阵列乘法,逐位相乘然后加到一起.   参考链接 https://github.com/wjcdx/jchdl/blob/edcc3e098d4f1cb21677e86e87a114 ...

  4. Myeclipse新建工作空间配置

    之前跟着尚硅谷JavaWeb视频学习,现在总结一下Myeclipse新建工作空间配置 Windows按钮下的Preferences 1. General -->   Workspace --&g ...

  5. (Java实现) 洛谷 P1115 最大子段和

    题目描述 给出一段序列,选出其中连续且非空的一段使得这段和最大. 输入输出格式 输入格式: 第一行是一个正整数NN,表示了序列的长度. 第二行包含NN个绝对值不大于1000010000的整数A_iA ...

  6. Java实现 LeetCode 682 棒球比赛(暴力)

    682. 棒球比赛 你现在是棒球比赛记录员. 给定一个字符串列表,每个字符串可以是以下四种类型之一: 1.整数(一轮的得分):直接表示您在本轮中获得的积分数. 2. "+"(一轮的 ...

  7. Java实现 蓝桥杯VIP 算法训练 成绩的等级输出

    输入一个百分制的成绩t后,按下式输出它的等级.等级为:90100为A,8089为B,7079为C,6069为D,0~59为E. 样例输入 98 样例输出 A import java.util.Scan ...

  8. Java实现合并排序

    1 问题描述 给定一组数据,使用合并排序得到这组数据的非降序排列. 2 解决方案 2.1 合并排序原理简介 引用自百度百科: 合并排序是建立在归并操作上的一种有效的排序算法.该算法是采用分治法(Div ...

  9. java算法集训代码填空题练习2

    1 连续数的公倍数 为什么1小时有60分钟,而不是100分钟呢?这是历史上的习惯导致. 但也并非纯粹的偶然:60是个优秀的数字,它的因子比较多. 事实上,它是1至6的每个数字的倍数.即1,2,3,4, ...

  10. 【大厂面试05期】说一说你对MySQL中锁的了解?

    这是我总结的一个表格,是本文中涉及到的锁(因为篇幅有限就没有包括自增锁) 加锁范围 名称 用法 数据库级 全局读锁 执行Flush tables with read lock命令各整个库接加一个读锁, ...