diff --git a/source/_posts/Java/Optional.md b/source/_posts/Java/Optional.md new file mode 100644 index 0000000..55e4472 --- /dev/null +++ b/source/_posts/Java/Optional.md @@ -0,0 +1,61 @@ +--- +title: Optional +date: 2018-6-14 21:51:16 +categories: + - Java +--- + +java8新增了很多有用的api , `Optional`就是其中之一 +首先它可以用来解决空指针的问题 +让代码更加简洁 , 而不需要多层的判断 + +比如 +```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 Optional ofNullable(T value) { + return value == null ? empty() : of(value); +} +``` + +`orElse`代表链式调用当中如果出现空值 , 则返回该内容 +同一个系列的还有 ++ `orElseGet` - 执行某个方法 , 比如 **.orElseGet( () -> getDefaultValue() )** ++ `orElseThrow` - 抛出一个异常 , 比如 **.orElseThrow( () -> new RuntimeException() )** diff --git a/source/_posts/前端杂烩/重新认识display.md b/source/_posts/前端杂烩/重新认识display.md index 3fcdd97..239c6fe 100644 --- a/source/_posts/前端杂烩/重新认识display.md +++ b/source/_posts/前端杂烩/重新认识display.md @@ -60,7 +60,7 @@ width和height是作用在哪个盒子上的 , 根据上面设置height和width width的默认值是`auto` 它至少包含以下不同的宽度表现 -+ **充分利用可用空间** : 这种表现之下 , 与设置100%值无差别 , 横向占满父容器 , 见于外在块级元素 , 比如`
`, `

` ++ **充分利用可用空间** : 这种表现之下 , 横向占满父容器 , 见于外在块级元素 , 比如`

`, `

` + **收缩与包裹** : 代表是浮动 绝对定位 inline-block元素或table元素 + **收缩到最小** : 容易出现在table-layout为auto的表格中 ( 表现为表格中的文字呈竖排被压缩为一列 ) + **超出父容器限制** : 内容为很长的连续英文或数字 ( 汉字可以在任意位置截断 ) , 或者内联元素被设置了`white-space:nowrap`