Optional
This commit is contained in:
parent
72a6daf3f5
commit
a4fcbf56a9
61
source/_posts/Java/Optional.md
Normal file
61
source/_posts/Java/Optional.md
Normal file
@ -0,0 +1,61 @@
|
||||
---
|
||||
title: Optional
|
||||
date: 2018-6-14 21:51:16
|
||||
categories:
|
||||
- Java
|
||||
---
|
||||
|
||||
java8新增了很多有用的api , `Optional`就是其中之一
|
||||
首先它可以用来解决空指针的问题
|
||||
让代码更加简洁 , 而不需要多层的判断
|
||||
<!-- more -->
|
||||
比如
|
||||
```java
|
||||
class User {
|
||||
private String username;
|
||||
private Role role;
|
||||
//getter与setter方法...
|
||||
}
|
||||
|
||||
class Role {
|
||||
private String rolename;
|
||||
//getter与setter方法...
|
||||
}
|
||||
```
|
||||
假如需要获取一个用户的角色名称 , 如果获取不到就返回"无角色"
|
||||
在以往我们需要这么写
|
||||
```java
|
||||
public static String getRoleName(User user) {
|
||||
if(user != null &&
|
||||
user.getRole() != null &&
|
||||
user.getRole().getRolename()!=null) {
|
||||
return user.getRole().getRolename();
|
||||
} else {
|
||||
return "无角色";
|
||||
}
|
||||
}
|
||||
```
|
||||
显然为了防止抛出NullPointerException , 需要进行多次判断
|
||||
在Java8当中 , 配合lamdba表达式 , 可以使用函数式编程的风格让代码更优雅
|
||||
```java
|
||||
public static String getRoleName2(User user) {
|
||||
return Optional.ofNullable(user)
|
||||
.map(u -> u.getRole())
|
||||
.map(r -> r.getRolename())
|
||||
.orElse("无角色");
|
||||
}
|
||||
```
|
||||
直接调用`Optional.of`当然也是可以的 , 只不过如果最初的user就是null的话 , 还是会抛出NullPointerException
|
||||
`Optional.ofNullable`它以一种宽容的方式来构造一个 Optional 实例. 来者不拒, 传 null 进到就得到 **Optional.empty()**, 非 null 就调用 **Optional.of(obj)**
|
||||
|
||||
以下摘自jdk1.8源码
|
||||
```java
|
||||
public static <T> Optional<T> ofNullable(T value) {
|
||||
return value == null ? empty() : of(value);
|
||||
}
|
||||
```
|
||||
|
||||
`orElse`代表链式调用当中如果出现空值 , 则返回该内容
|
||||
同一个系列的还有
|
||||
+ `orElseGet` - 执行某个方法 , 比如 **.orElseGet( () -> getDefaultValue() )**
|
||||
+ `orElseThrow` - 抛出一个异常 , 比如 **.orElseThrow( () -> new RuntimeException() )**
|
||||
@ -60,7 +60,7 @@ width和height是作用在哪个盒子上的 , 根据上面设置height和width
|
||||
|
||||
width的默认值是`auto`
|
||||
它至少包含以下不同的宽度表现
|
||||
+ **充分利用可用空间** : 这种表现之下 , 与设置100%值无差别 , 横向占满父容器 , 见于外在块级元素 , 比如`<div>`, `<p>`
|
||||
+ **充分利用可用空间** : 这种表现之下 , 横向占满父容器 , 见于外在块级元素 , 比如`<div>`, `<p>`
|
||||
+ **收缩与包裹** : 代表是浮动 绝对定位 inline-block元素或table元素
|
||||
+ **收缩到最小** : 容易出现在table-layout为auto的表格中 ( 表现为表格中的文字呈竖排被压缩为一列 )
|
||||
+ **超出父容器限制** : 内容为很长的连续英文或数字 ( 汉字可以在任意位置截断 ) , 或者内联元素被设置了`white-space:nowrap`
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user