Optional学习笔记

本文是我在学习Optional类时候做的笔记,基于JDK8,如果有其他方法是基于后续版本的会用红色字体标注。 

of(value)和ofNullable(null)方法都是获取Optional对象的方法。

// 获取Optional对象的方法
// of方法参数不能是null    
Optional<String> op1 = Optional.of("test");
System.out.println(op1);
// ofNullable方法参数无限制可以是null,也可以不是
Optional<Integer> op2 = Optional.ofNullable(null);
System.out.println(op2);
Optional<Integer> op3 = Optional.ofNullable(123);
System.out.println(op3);

打印出来的结果如下,[ ]中的内容是传入的参数,传入null则为empty。

Optional[test]
Optional.empty
Optional[123]

 empty():返回一个空的Optional对象。

// empty方法获取一个空的Optional对象。
Optional<String> op1 = Optional.of("test");
Optional<Integer> op2 = Optional.ofNullable(null);
// 创建Optional对象的时候不管有没有参数,最后都会指向同一个对象。
System.out.println(op1.empty() == op2.empty());// true
// empty方法的源码,返回的EMPTY是静态常量
private static final Optional<?> EMPTY = new Optional<>();
public static<T> Optional<T> empty() {
    @SuppressWarnings("unchecked")
    Optional<T> t = (Optional<T>) EMPTY;
    return t;
}

 isPresent():判断Optional对象是否有值。

Optional<String> op1 = Optional.of("test");
Optional<Integer> op2 = Optional.ofNullable(null);
// isPresent方法判断当前Optional对象是否有实际内容
System.out.println(op1.isPresent());// true
System.out.println(op2.isPresent());// false
// get方法获取Optional对象中的内容
System.out.println(op1.get());// test
// 如果当前Optional为空对象调用get方法会报错,所以调用get方法之前先调用isPresent方法进行判断
System.out.println(op2.get());// java.util.NoSuchElementException: No value present

isEmpty():判断Optional对象是否为空,与isPresent()正好相反。此方法JDK11之后的版本可用。

Optional<String> op1 = Optional.of("test");
boolean empty1 = op1.isEmpty();
Optional<Integer> op2 = Optional.ofNullable(null);
boolean empty2 = op2.isEmpty();
System.out.println(empty1);// false
System.out.println(empty2);// true

 ifPresent(Consumer):Optional对象如果有值则执行consumer中的accept方法,为空则什么都不做。

Optional<String> op1 = Optional.of("test");
Optional<Integer> op2 = Optional.ofNullable(null);
// Optional对象有值调用Consumer对象中的accept方法,空对象则不调用
op1.ifPresent(new Consumer<String>() {
	@Override
	public void accept(String str) {
		System.out.println(str);
	}
});
op2.ifPresent(new Consumer<Integer>() {
	@Override
	public void accept(Integer i) {
		System.out.println(i);
	}
});

 ifPresentOrElse(Consumer,Runnable):参数实现两个接口Consumer和Runnable,Consumer接口是和ifPreset一样,区别在于对于空值的处理。ifPreset什么都不做,ifPresentOrElse会执行Runnable的实现方法。此方法JDK9之后的版本可用。

Optional<String> op1 = Optional.of("test");
Optional<Integer> op2 = Optional.ofNullable(null);
op1.ifPresentOrElse(new Consumer<String>() {
	@Override
	public void accept(String str) {
		System.out.println(str);
	}
}, new Runnable() {
	@Override
	public void run() {
		System.out.println("Optional is empty!");
	}
});
op2.ifPresentOrElse(new Consumer<Integer>() {
	@Override
	public void accept(Integer i) {
		System.out.println(i);
	}
}, new Runnable() {
	@Override
	public void run() {
		System.out.println("Optional is empty!");
	}
});
// 打印结果
// test
// Optional is empty!

源码如下:

public void ifPresent(Consumer<? super T> action) {
    if (value != null) {
        action.accept(value);
    }
}
public void ifPresentOrElse(Consumer<? super T> action, Runnable emptyAction) {
    if (value != null) {
        action.accept(value);
    } else {
        emptyAction.run();
    }
}

 orElse(value):Optional对象如果有值则返回该值,为空则返回传入的参数。

Optional<String> op1 = Optional.of("test");
Optional<Integer> op2 = Optional.ofNullable(null);
// Optional对象如果有值,orElse会返回Optional对象对象中存储的值,为空则返回参数中的值
System.out.println(op1.orElse(null));// test
System.out.println(op2.orElse(null));// null

 orElseGet():与orElse(value)方法一致,只是返回值的方式不同。

Optional<String> op1 = Optional.of("test");
Optional<Integer> op2 = Optional.ofNullable(null);
// Optional对象如果有值,orElseGet会返回Optional对象对象中存储的值,为空则返回自己指定的值
System.out.println(op1.orElseGet(() -> {
	return "1";
}));
System.out.println(op2.orElseGet(() -> {
	return 1;
}));

orElseThrow(Supplier):Optional对象为空则抛异常,有值则什么都不做。

Optional<String> op1 = Optional.of("test");
Optional<Integer> op2 = Optional.ofNullable(null);
// Optional对象如果有值,orElseThrow方法什么都不做,为空则抛异常
try {
	op1.orElseThrow(() -> {
		throw new IllegalStateException();
	});
} catch (IllegalStateException e) {
	System.out.println("op1发生异常:" + e.getMessage());
	e.printStackTrace();
}
try {
	op2.orElseThrow(() -> {
		throw new IllegalStateException();
	});
} catch (IllegalStateException e) {
	System.out.println("op2发生异常:" + e.getMessage());
	e.printStackTrace();
}

 orElseThrow():与orElseThrow(Supplier)相似,区别在于不用自己实现抛异常。此方法JDK10之后版本可用。

Optional<String> op1 = Optional.of("test");
Optional<String> op2 = Optional.ofNullable(null);
System.out.println(op1.orElseThrow());// test
System.out.println(op2.orElseThrow());// java.util.NoSuchElementException: No value present

 filter(Predicate):判断Optional对象中的值是否符合条件,符合返回原值,否则返回空Optional对象。

Optional<String> op1 = Optional.of("test");
Optional<Integer> op2 = Optional.ofNullable(null);
// filter方法判断Optional对象中的值是否符合条件并返回新的Optional对象
Optional<String> newOp1 = op1.filter((o) -> o.equals("test"));
// Optional对象为空的话,则返回当前对象
Optional<Integer> newOp2 = op2.filter((o) -> o == 1);
System.out.println(newOp1);// Optional[test]
System.out.println(newOp2);// Optional.empty

源码如下:

public Optional<T> filter(Predicate<? super T> predicate) {
    Objects.requireNonNull(predicate);
    if (!isPresent())
    return this;
    else
    return predicate.test(value) ? this : empty();
}

map(Function):对Optional对象进行函数运算,返回新的Optional对象。

// map方法对Optional对象进行函数运算,返回新的Optional对象
Optional<String> str1 = op1.map((o) -> "key" + o);
// Optional对象如果为空,则一个新的空Optional对象
Optional<String> str2 = op2.map((o) -> "key" + o);
System.out.println(str1.get());// keytest
System.out.println(str2.isPresent());// false

源码如下:

public<U> Optional<U> map(Function<? super T, ? extends U> mapper) {
    Objects.requireNonNull(mapper);
    if (!isPresent())
        return empty();
    else {
        return Optional.ofNullable(mapper.apply(value));
    }
}

flatMap():功能和map()类似。

Optional<String> op1 = Optional.of("test");
// flatMap方法与map方法类似,如果map方法采用和flatMap相同的写法,则返回值必须为Optional对象
Optional<Optional<String>> str1 = op1.map((o) -> {
	return Optional.of("key" + o);
});
Optional<String> str2 = op1.flatMap((o) -> {
	return Optional.of("key" + o);
});
System.out.println(str1.get().get());// keytest
System.out.println(str2.get());// keytest

源码如下:

public<U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper) {
    Objects.requireNonNull(mapper);
    if (!isPresent())
        return empty();
    else {
        return Objects.requireNonNull(mapper.apply(value));
    }
}

map()和flatMap()的区别在于传入非空对象时返回值的不同,map()返回值必须是Optional对象,flatMap()则可以是任意类型。

or(Supplier):参数实现Supplier接口,Optional对象有值直接返回,为空则返回实现的get方法。此方法JDK9之后版本可用。

Optional<String> op1 = Optional.of("test");
Optional<String> op2 = Optional.of("");
Optional<String> op3 = Optional.ofNullable(null);
Optional<String> or1 = op1.or(new Supplier<Optional<? extends String>>() {
	@Override
	public Optional<? extends String> get() {
		return Optional.of("Optional is empty");
	}
});
Optional<String> or2 = op2.or(new Supplier<Optional<? extends String>>() {
	@Override
	public Optional<? extends String> get() {
		return Optional.of("Optional is empty");
	}
});
Optional<String> or3 = op3.or(new Supplier<Optional<? extends String>>() {
	@Override
	public Optional<? extends String> get() {
		return Optional.of("Optional is empty");
	}
});
System.out.println(or1);// Optional[test]
System.out.println(or2);// Optional[]
System.out.println(or3);// Optional[Optional is empty]

源码如下:

public Optional<T> or(Supplier<? extends Optional<? extends T>> supplier) {
    Objects.requireNonNull(supplier);
    if (isPresent()) {
        return this;
    } else {
    @SuppressWarnings("unchecked")
    Optional<T> r = (Optional<T>) supplier.get();
        return Objects.requireNonNull(r);
    }
}

stream():将一个Optional对象转换成Stream对象。有值返回当前值的Stream对象,为空则返回空的Stream对象。此方法JDK9之后版本可用。

Optional<String> op1 = Optional.of("test");
Optional<String> op2 = Optional.ofNullable(null);
Stream<String> stream1 = op1.stream();
Stream<String> stream2 = op2.stream();
System.out.println(stream1.findAny());// Optional[test]
System.out.println(stream2.findAny());// Optional.empty

源码如下:

public Stream<T> stream() {
    if (!isPresent()) {
        return Stream.empty();
    } else {
        return Stream.of(value);
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值