标签:java8,optional,kotlin
本文主要给大家介绍了关于Java8中Optional类型和Kotlin中可空类型使用的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍:
在 Java 8中,我们可以使用 Optional 类型来表达可空的类型。
package com.easy.kotlin;
import java.util.Optional;
import static java.lang.System.out;
/**
* Optional.ofNullable - 允许传递为 null 参数
* Optional.of - 如果传递的参数是 null,抛出异常 NullPointerException
* Optional<String> b = Optional.of(s);
*/
public class Java8OptionalDemo {
public static void main(String[] args) {
out.println(strLength(Optional.of("abc")));
out.println(strLength(Optional.ofNullable(null)));
}
static Integer strLength(Optional<String> s) {
return s.orElse("").length();
}
}
运行输出:
3
0
但是,这样的代码,依然不是那么地优雅。
针对这方面 Groovy 提供了一种安全的属性/方法访问操作符 ?.
user?.getUsername()?.toUpperCase();
Swift 也有类似的语法, 只作用在 Optional 的类型上。
Kotlin 中的可空类型
上面 Java 8的例子,用 Kotlin 来写就显得更加简单优雅了:
package com.easy.kotlin
fun main(args: Array<String>) {
println(strLength(null))
println(strLength("abc"))
}
fun strLength(s: String?): Int {
return s?.length ?: 0
}
其中,我们使用 String? 同样表达了 Optional<String>
的意思,相比之下,哪个更简单?
一目了然。
还有Java 8 Optional 提供的orElse
s.orElse("").length();
这个东东,在 Kotlin 是最最常见不过的 Elvis 运算符了:
s?.length ?: 0
相比之下,还有什么理由继续用 Java 8 的 Optional 呢?
Kotlin 中的明星符号
??????????????????????????????????????
?: ?: ?: ?: ?: ?: ?: ?: ?: ?: ?: ?: ?: ?: ?: ?: ?: ?: ?: ?: ?: ?: ?: ?: ?: ?:
?. ?. ?. ?. ?. ?. ?. ?. ?. ?. ?. ?. ?. ?. ?. ?. ?. ?. ?. ?. ?. ?. ?. ?. ?. ?. ?. ?. ?. ?.
示例源代码工程Github 地址:
https://github.com/EasyKotlin/java_optional_vs_kotlin_nullable_type
本地下载地址:
http://xiazai.jb51.net/201709/yuanma/java_optional_vs_kotlin(jb51.net).rar
来源:http://www.jianshu.com/p/515244085e8e


猜你喜欢
- Android里判断是否可以上网,常用的是如下方法:/** * 检测网络是否连接 * * @return */private boolea
- 前言在分布式场景下为了保证数据最终一致性。在单进程的系统中,存在多个线程可以同时改变某个变量(可变共享变量)时,就需要对变量或代码块做同步(
- 关于Android的webview,用过的想必都不会陌生。这里我就不说webview的基本用法了,想要知道的可以去网上百多,有很多介绍web
- 本文实例讲述了Java使用Random类生成随机数。分享给大家供大家参考,具体如下:一 代码import java.util.Random;
- import java.lang.reflect.InvocationHandler;import java.lang.reflect.Me
- 使用Post添加数据到数据库出现方块乱码解决方法,在web.xml里最前面添加过滤器,代码如下,放在最前面,因为有优先级,要首先拦截<
- 什么是RabbitMQ?RabbitMQ是由erlang语言开发的一个基于AMQP(Advanced Message Queuing Pro
- Java项目涉及到数据库交互,以往常用的是JDBC,现在则有Hibernate、Mybatis等这些持久化支持。项目中用到了MyBatis,
- 1.关系运算符!= 与等号共同组成关系运算符,检查两个操作数的值是否相等,如:A!=B2.逻辑运算符! 称为逻辑非运算符。用来逆转操作数的逻
- 下面有一个字符串阵列:string[] elements = {"adsf","etwert" ,&
- LRU算法:最近最少使用淘汰算法(Least Recently Used)。LRU是淘汰最长时间没有被使用的缓存(即使该缓存被访问的次数最多
- 什么是线程池线程池(thread pool)是一种线程使用模式。线程过多或者频繁创建和销毁线程会带来调度开销,进而影响缓存局部性和整体性能。
- Java绘图中,显示文字的方法主要有三种:(1)drawString(String str,int x,int y):在指定的位置显示字符串
- 一.介绍Apache Shiro是Java的一个安全框架。目前,使用Apache Shiro的人越来越多,因为它相当简单,对比Spring
- 幂等概述幂等性原本是数学上的概念,即使公式:f(x)=f(f(x)) 能够成立的数学性质。用在编程领域,则意为对同一个系统,使用同样的条件,
- 一、泛型的基本概念java与c#一样,都存在泛型的概念,及类型的参数化。java中的泛型是在jdk5.0后出现的,但是java中的泛型与C#
- 在 Android 手机中内置了一款高性能 webkit 内核浏览器, SDK 中封装为一个叫做 WebView 组件。 WebView 类
- 介绍最近项目开发中用到了WebView播放视频的功能,总结了开发中犯过的错误,这些错误在开发是及容易遇到的,所以我这里总结了一下,希望大家看
- 在安卓开发导入项目过程中,出现错误再所难免。最近导入项目就遇到如下错误,具体如下图所示。出现如上错误,最初设想先看下项目能不能运行。经尝试可
- 上一次说了如何收集我们已经发布的应用程序的错误信息,方便我们调试完善程序。上次说的收集方法主要是把收集的信息通过Http的post请求把相关