Java Optional学习笔记
2023-09-14 09:03:51 时间
(1) 这个Optional.of方法还是不接收null作为输入参数:
而Optional.ofNullable可以接收null参数:
isPresent判断有无数据,这个没啥可以说的:
如果Optional容器包含的值不是null,执行action.
orElse: 如果Optional对象存在,返回原始对象,否则返回orElse里构造的新对象:
上图84行的getName其实是一个映射器,将Person对象映射成String.
在debugger里看到这个mapper实际上是个Lambda Function:
结果是包裹类型为映射函数的第二个参数:
ifPresent的参数是一个action:
我的测试代码:
package optionalTest;
import java.util.Optional;
import java.util.function.Function;
public class OptionalTest {
class Person {
private String mName;
private Skill mSkill;
public Person(String name) {
mName = name;
}
public Skill getSkill(){
return mSkill;
}
public Optional<Skill> getSkillOptional(){
return Optional.ofNullable(mSkill);
}
public void setSkill(Skill skill){
mSkill = skill;
}
public String getName() {
return mName;
}
public void greet() {
System.out.println("I am: " + mName);
}
}
class Skill{
private String mName;
private int mLevel;
public Skill(String name, int level) {
mName = name;
mLevel = level;
}
public void display(){
System.out.println("Skill: " + mName + " level: " + mLevel);
}
}
@SuppressWarnings("unused")
public void scenario1(){
Person person = null;
try {
Optional<Person> p1 = Optional.of(person);
}
catch ( Exception e) {
System.out.println("Error: " + e.getClass().getName() + " - " + e.getLocalizedMessage());
}
Optional<Person> p2 = Optional.ofNullable(person);
System.out.println(p2.isPresent());
Person jerry = new Person("Jerry");
Optional<Person> p3 = Optional.ofNullable(jerry);
System.out.println(p3.isPresent());
System.out.println("p2 test");
p2.ifPresent((p) -> p.greet());
System.out.println("p3 test");
p3.ifPresent((p) -> p.greet());
System.out.println("Example 3");
// before Jave8
Person oldImplementation = ( person != null? person:new Person("Ji"));
Person newPerson = p2.orElse(new Person("Ji"));
Person existPerson = p3.orElse(new Person("Mr Unknown"));
newPerson.greet();
existPerson.greet();
if( jerry != null && jerry.getName().equals("Jerry")) {
System.out.println("old style-> Jerry found: " + jerry.getName());
}
p3.filter( personHolder -> "Jerry".equals(personHolder.getName())).
ifPresent((personH2) -> System.out.println("new style-> Jerry found: " + personH2.getName()));
Function<Person,String> mapper = Person::getName;
Optional<String> mapResult = p3.map(mapper);
p3.map(Person::getName)
.filter( Name -> "Jerry".equals(Name))
.ifPresent( foundName -> System.out.println("new style 2-> Jerry found: " + foundName));
/*jerry.setSkill("JavaScript");
Optional<String> jerrySkill = p3.map(Person::getSkill);
System.out.println(jerrySkill.isPresent());
p3.map(Person::getSkill)
.filter(Skill -> "JavaScript".equals(Skill))
.ifPresent( Skill2 -> System.out.println("Jerry's skill is: " + Skill2 ) );*/
Skill jsSkill = new Skill("JavaScript", 80);
jerry.setSkill(jsSkill);
Optional<Skill> temp = p3.map(Person::getSkill);
Optional<Skill> temp2 = p3.flatMap(Person::getSkillOptional);
Skill s1 = temp.get();
Skill s2 = temp2.get();
s1.display();
s2.display();
}
public static void main(String[] args) {
OptionalTest test = new OptionalTest();
test.scenario1();
}
}
要获取更多Jerry的原创文章,请关注公众号"汪子熙":
相关文章
- java除零异常_JAVA异常处理
- java中打印数组的方法_Java数组方法–如何在Java中打印数组
- Java学习笔记–StringTokenizer的使用「建议收藏」
- java数组排序去重_JAVA数组去重排序
- Java基础知识点笔记(一):java中的取整与四舍五入
- java一个字符几个字节_Java 语言中一个字符占几个字节?
- java基本数据类型 think in java_Think in Java(一):Java基础[通俗易懂]
- java无法获取服务器上路径,JAVA获取服务器路径的步骤
- java 生成xml dom4j_Java生成xml——DOM4J生成
- Java基础入门笔记01——JAVASE,EE,ME 常用Dos命令,JVM,JRE,JDK「建议收藏」
- java验证手机号正则表达式_Java使用正则表达式验证手机号和电话号码的方法「建议收藏」
- java的json解析几种方法_java读取json文件并解析
- JAVA英文文献_java毕业论文参考文献
- java并发编程(1):Java多线程-基本线程类-基础知识复习笔记
- Java学习笔记 基础知识(注释、基本数据类型)
- Java学习笔记 (多态、接口、抽象类)
- Java基础学习笔记五 Java基础语法之面向对象详解编程语言
- Java学习笔记之二十九Java中的”equals”和”==”的用法及区别详解编程语言
- Java学习笔记之二十final关键字在Java继承中的用法小结详解编程语言
- Java学习笔记之七java函数的语法规则总结详解编程语言
- Java学习笔记之四java进制转化详解编程语言
- Java学习笔记之二java标识符命名规范详解编程语言
- 《Effect Java》学习笔记1———创建和销毁对象详解编程语言
- java学习笔记06–正则表达式详解编程语言
- Java网站在Linux上的运行(java网站linux)
- Linux与Java:驱动着计算未来(linux与java)
- 应用『Java应用程序中Redis缓存的使用』(redis缓存与java)
- Java调用Linux库实现跨系统功能(java调用linux库)
- Java程序在Linux系统中实现命令操作(java运行linux命令)
- Java数据库之MySQL学习使用教程(mysql中java教程)
- java学习笔记(入门篇)_java程序helloWorld
- java学习笔记(入门篇)_java的基础语法