java8 Optional类用法解析

在Java中,null代表一个不存在的对象,如果对它进行操作就会抛出java.lang.NullPointerException异常。NPE(NullPointerException)是调试程序最常见的异常。google一下有很多关于方法到底应该返回null还是new一个空对象的讨论。 

类似于scala的scala.Option[T]、Haskell的Data.Maybe,Java 8 引入了java.util.Optional<T>。Opitonal就是一个元素的容器,Java8新添加的很多类或者方法的返回值都使用了Opitonal。Java5的话可以使用Google Guava的Optional来实现,Java8的Optional的接口跟Guava的Optional很相似。 

// 创建Optional
String mayBeNull = null;
Optional<String> opt1 = Optional.of(" Hello, rensanning! ");
Optional<String> opt2 = Optional.ofNullable(mayBeNull);
Optional<String> opt3 = Optional.empty();

ifPresent 方法

<span style="font-size:14px;">// ifPresent
opt1.ifPresent(System.out::println); // " Hello, rensanning! "
opt2.ifPresent(System.out::println);
opt3.ifPresent(System.out::println);</span>
isPresent 方法
// isPresent
boolean b1 = opt1.isPresent();
boolean b2 = opt2.isPresent();
boolean b3 = opt3.isPresent();
System.out.println(b1 + "\t" + b2 + "\t" + b3); // true	false	false

filter 方法

<span style="font-size:10px;">// filter
opt1.filter(x -> x.contains("ren"))
	.ifPresent(System.out::println); // " Hello, rensanning! "
opt2.filter(x -> x.contains("ren"))
	.ifPresent(System.out::println);
opt3.filter(x -> x.contains("ren"))
	.ifPresent(System.out::println);</span>
map 方法

<span style="font-size:10px;">// map
opt1.map(String::trim)
	.ifPresent(System.out::println); // "Hello, rensanning!"</span>
flatMap 方法

// flatMap
Optional<String> lastName = Optional.of("last");
Optional<String> firstName = Optional.of("first");
Optional<String> fullName = 
		  lastName.flatMap(ln -> firstName.map(fn -> String.join(" ", ln, fn)));
System.out.println(fullName.get()); // "last first"
get 方法

Optional<Integer> len = opt1.map(String::length);
// get
System.out.println(len.get()); // 20
try {
	System.out.println(opt2.get());
} catch (Exception e) {
	// java.util.NoSuchElementException
	e.printStackTrace();
}
orElse  orElseGet  orElseThrow  方法
// orElse/orElseGet/orElseThrow
int len1 = opt1.map(String::length).orElse(-1);
int len2 = opt2.map(String::length).orElse(-1);
int len3 = opt3.map(String::length).orElseGet(() ->  5*40);
System.out.println(len1 + "\t" + len2 + "\t" + len3); // 20	-1	200
try {
	opt3.filter(s -> !s.isEmpty())
		.map(s -> s.charAt(0))
		.orElseThrow(IllegalArgumentException::new);
} catch (Exception e) {
	// java.lang.IllegalArgumentException
	e.printStackTrace();
}








  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java Stream 是 Java 8 中新增的一个 API,用于处理集合数据。它提供了一种更加简洁、高效的方式来操作集合,可以让代码更加简洁、易读、易维护。下面是 Java Stream 的基本使用方法: 1. 创建流 Java Stream 可以从多种数据源中创建,比如集合、数组、文件等。例如,从集合创建一个 Stream 可以使用以下代码: ```java List<String> list = new ArrayList<>(); Stream<String> stream = list.stream(); ``` 2. 中间操作 中间操作是指对 Stream 进行操作,返回一个新的 Stream。常见的中间操作包括:filter、map、sorted、distinct 等。例如,下面的代码使用 filter 操作过滤出长度大于 5 的字符串: ```java List<String> list = Arrays.asList("apple", "banana", "orange", "watermelon"); Stream<String> stream = list.stream().filter(s -> s.length() > 5); ``` 3. 终止操作 终止操作是指对 Stream 进行最终的操作,返回一个非 Stream 的结果。常见的终止操作包括:forEach、reduce、collect、count 等。例如,下面的代码使用 forEach 操作输出过滤后的字符串: ```java List<String> list = Arrays.asList("apple", "banana", "orange", "watermelon"); list.stream().filter(s -> s.length() > 5).forEach(System.out::println); ``` 4. 短路操作 短路操作是指对 Stream 进行操作时,只要满足一定条件就可以停止操作,不必对整个流进行操作。常见的短路操作包括:findFirst、findAny、allMatch、anyMatch、noneMatch 等。例如,下面的代码使用 findAny 操作找到第一个长度大于 5 的字符串: ```java List<String> list = Arrays.asList("apple", "banana", "orange", "watermelon"); Optional<String> result = list.stream().filter(s -> s.length() > 5).findAny(); ``` 以上就是 Java Stream 的基本使用方法,需要注意的是,Stream 是一次性的,一旦进行了终止操作,就不能再对该 Stream 进行操作。同时,Stream 也是惰性求值的,只有在终止操作时才会进行真正的计算。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值