`
rensanning
  • 浏览: 3513960 次
  • 性别: Icon_minigender_1
  • 来自: 大连
博客专栏
Efef1dba-f7dd-3931-8a61-8e1c76c3e39f
使用Titanium Mo...
浏览量:37478
Bbab2146-6e1d-3c50-acd6-c8bae29e307d
Cordova 3.x入门...
浏览量:604304
C08766e7-8a33-3f9b-9155-654af05c3484
常用Java开源Libra...
浏览量:678049
77063fb3-0ee7-3bfa-9c72-2a0234ebf83e
搭建 CentOS 6 服...
浏览量:87250
E40e5e76-1f3b-398e-b6a6-dc9cfbb38156
Spring Boot 入...
浏览量:399811
Abe39461-b089-344f-99fa-cdfbddea0e18
基于Spring Secu...
浏览量:69066
66a41a70-fdf0-3dc9-aa31-19b7e8b24672
MQTT入门
浏览量:90468
社区版块
存档分类
最新评论

Java 8 之 Optional类

    博客分类:
  • Java
阅读更多
在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
opt1.ifPresent(System.out::println); // " Hello, rensanning! "
opt2.ifPresent(System.out::println);
opt3.ifPresent(System.out::println);


// 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
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);


// map
opt1.map(String::trim)
	.ifPresent(System.out::println); // "Hello, rensanning!"


// 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"


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
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();
}


// Optional -> List
List<String> list1 = opt1.map(Collections::singletonList)
   	 				     .orElse(Collections.emptyList());
System.out.println(list1.get(0));// " Hello, rensanning! "


// OptionalInt/OptionalLong/OptionalDouble
OptionalInt optionalInt = OptionalInt.of(90);
System.out.println(optionalInt.getAsInt()); // 90		
OptionalLong optionalLong = OptionalLong.of(999_999_999_999_999_999L);
System.out.println(optionalLong.getAsLong()); // 999999999999999999		
OptionalDouble optionalDouble = OptionalDouble.of(56.000009);
System.out.println(optionalDouble.getAsDouble()); // 56.000009


参考:
http://www.importnew.com/6675.html
http://blog.informatech.cr/2013/04/10/java-optional-objects/
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics