Java 10 实战第 1 篇:局部变量类型推断
现在 Java 9 被遗弃了直接升级到了 Java 10,之前也发过 Java 10 新特性的文章,现在是开始实战 Java 10 的时候了。
今天要实战的是 Java 10 中最重要的特性:局部变量类型推断,大家都知道是 var
关键字,但具体怎么使用,及要注意什么要点呢?
我们通过几个例子来讲解局部变量类型推断这个新特性!
什么是局部变量类型推断
var javastack = "javastack";
System.out.println(javastack);
大家看出来了,局部变量类型推断就是左边的类型直接使用 var
定义,而不用写具体的类型,编译器能根据右边的表达式自动推断类型,如上面的 String
。
var javastack = "javastack";
就等于:
String javastack = "javastack";
局部变量类型推断使用示例
既然叫局部变量类型推断,以只能用在局部变量中,下面给出更多使用示例。
1、字面量定义局部变量
private static void testVar() {
var javastack = "javastack";
System.out.println(javastack);
}
2、接收方法返回值定义局部变量
private static void testMethod() {
var javastack = getJavastack();
System.out.println(javastack);
}
public static String getJavastack() {
return "javastack";
}
3、循环中定义局部变量
private static void testLoop() {
for (var i = 0; i < 3; i++) {
for (var m = 10; m < 15; m++) {
System.out.println(i + m);
}
}
}
4、泛型结合局部变量
private static void testGeneric() {
// 表达式1
List<String> list1 = new ArrayList<>();
list1.add("javastack");
// 表达式2
var list2 = new ArrayList<>();
list2.add(2018);
// 表达式3
var list3 = new ArrayList<String>();
list3.add("javastack");
}
表达式1后面 <>
里面 jdk 1.7+开始是不用带具体类型的,在接口中指明就行了。
表达式2中如果使用 var
的话,<>
里面默认会是 Object
的,所以可以添加任意类型。
表达式3中在 <>
强制使用了 String 来指定泛型。
局部变量类型推断不能用在以下场景
1、类成员变量类型
// 编译报错
private var javastack = "Java技术栈";
2、方法返回类型
/**
* 编译报错
* @return
*/
public static var getJavastack(){
return "Java技术栈";
}
3、Lambda 表达式
private static void testLambda() {
Runnable runnable = () -> System.out.println("javastack");
// 编译报错
// var runnable = () -> System.out.println("javastack");
}
以上 3 种场景是肯定不能使用 var
的,其他场合有待验证。
局部变量类型推断优缺点
优点:简化代码
CopyOnWriteArrayList list1 = new CopyOnWriteArrayList();
ConcurrentModificationException cme1 = new ConcurrentModificationException();
DefaultServiceUnavailableRetryStrategy strategy1 = new
DefaultServiceUnavailableRetryStrategy();
var list2 = new CopyOnWriteArrayList<>();
var cme2 = new ConcurrentModificationException();
var strategy2 = new DefaultServiceUnavailableRetryStrategy();
从以上代码可以看出,很长的定义类型会显得代码很冗长,使用 var 大大简化了代码编写,同时类型统一显得代码很对齐。
缺点:掩盖类型
var token = new JsonParserDelegate(parser).currentToken();
看以上代码,不进去看返回结果类型,谁知道返回的类型是什么?所以这种情况最好别使用 var
,而使用具体的抽象类、接口或者实例类型。
var关键字原理
var其实就是 Java 10 增加的一种语法糖而已,在编译期间会自动推断实际类型,其编译后的字节码和实际类型一致,如以下例子所示。
private static void testByteCode() {
String javastack1 = "javastack";
var javastack2 = "javastack";
}
编译成字节码后:
private static testByteCode()V
L0
LINENUMBER 22 L0
LDC "javastack"
ASTORE 0
L1
LINENUMBER 23 L1
LDC "javastack"
ASTORE 1
L2
LINENUMBER 24 L2
RETURN
L3
LOCALVARIABLE javastack1 Ljava/lang/String; L1 L3 0
LOCALVARIABLE javastack2 Ljava/lang/String; L2 L3 1
MAXSTACK = 1
MAXLOCALS = 2
可以看出 javastack1
和 javastack2
都是虚拟机所认识的的本地变量类型:java.lang.String
,虚拟机并不认识 var, 所以 var
并不神奇。
OK,本次 Java 10 局部变量类型推断实战文章就到这里了,后续带来更多的 Java 10 的实战方面的文章。
Java 10 实战第 1 篇:局部变量类型推断的更多相关文章
- JDK11 | 第三篇 : 局部变量类型推断
文章首发于公众号<程序员果果> 地址 : https://mp.weixin.qq.com/s/PB0Mw4bzjDML7nto2M8x2w 一.简介 Java局部变量类型推断(LVTI) ...
- 译:Java局部变量类型推断(Var类型)的26条细则
原文链接:https://dzone.com/articles/var-work-in-progress 作者:Anghel Leonard 译者:沈歌 Java局部变量类型推断(LVTI),简称va ...
- java 11 局部变量类型推断
什么是局部变量类型推断? var javastack = "javastack"; System.out.println(javastack); 大家看出来了,局部变量类型推断就是 ...
- 【整理】Java 10新特性总结
Java 9才发布几个月,很多玩意都没整明白,Java 10就来了..这时候我真尼玛想说:线上用的JDK 7 ,JDK 8 还没用熟,JDK 9 才发布不久不知道啥玩意,JDK 10……刚学Java的 ...
- Java 10 var关键字详解和示例教程
在本文中,我将通过示例介绍新的Java SE 10特性——“var”类型.你将学习如何在代码中正确使用它,以及在什么情况下不能使用它. 介绍 Java 10引入了一个闪亮的新功能:局部变量类型推断.对 ...
- Java 10 的 10 个新特性,将彻底改变你写代码的方式!
Java 9才发布几个月,很多玩意都没整明白,现在Java 10又快要来了.. 这时候我真尼玛想说:线上用的JDK 7 甚至JDK 6,JDK 8 还没用熟,JDK 9 才发布不久不知道啥玩意,JDK ...
- Java 10 的 10 个新特性,你颤抖了吗?
Java 9才发布几个月,很多玩意都没整明白,现在Java 10又快要来了.. 这时候我真尼玛想说:线上用的JDK 7 甚至JDK 6,JDK 8 还没用熟,JDK 9 才发布不久不知道啥玩意,JDK ...
- Java 10的10个新特性,将彻底改变你写代码的方式!
Java 9才发布几个月,很多玩意都没整明白,现在Java 10又快要来了.. 这时候我真尼玛想说:线上用的JDK 7 甚至JDK 6,JDK 8 还没用熟,JDK 9 才发布不久不知道啥玩意,JDK ...
- Java 10更新汇总,新的编译器通吃主流编程语言
早些时候Oracle发布了Java 10,这是Oracle更改发布策略之后的第一版Java,Oracle现已决定每六个月发布一个新的Java版本,周期缩短了,但是并不是说我们要学的更多了,而是说缩短开 ...
随机推荐
- 微软microsoft word的api文档地址
https://docs.microsoft.com/en-us/previous-versions/office/developer/office-2003/aa172758(v%3doffice. ...
- php 获取数组深度的值
匿名函数(闭包) $val = array(); array_walk_recursive($array, function ($x) use (&$val) { $val[] = $x; } ...
- WMS接口平台配置培训
供应链管理平台地址:https://twms.ninestargroup.com/ibus/#/processconfig?scShortcutld=3_17__1_303 WMS提供WSWMS固定的 ...
- VMware12上安装CentOS7无法上网问题
常安装使用VMware的搭建集群环境,VMare安装后虚拟机默认的是自动获取IP,有时候用的过程中突然XSHELL中断或者需要固定IP上网,遇到几次居然,但忘了步骤,总结一下,省的每次去找资料 环境配 ...
- 【收藏】UICrawler
基于 Appium 的 App UI 遍历 & Monkey 工具 (支持操作步骤回放) UICrawler https://github.com/lgxqf/UICrawler 基于Appi ...
- 分布式01-Dubbo基础背景
分布式01-Dubbo基础 1-分布式基础理论 分布式系统是由一组通过网络进行通信.为了完成共同的任务而协调工作的计算机节点组成的系统.分布式系统的出现是为了用廉价的.普通的机器完成单个计算机无法完成 ...
- 源发行版 1.8 需要目标发行版 1.8以及usage of api documented as @since 1.8+
Maven项目每个Module都有单独的pom.xml,如果不在pom.xml中进行配置,则默认将Module的Language Level设置为5.所以要在pom.xml文件中添加插件进行配置. & ...
- Kettle (5) - 获取 Web 数据
使用 Kettle 获取网页数据.当然,这里的网页数据主要指结构化数据,可能是 xml 格式.json 格式 或者 csv 文件等.以 http://services.odata.org/V3/Nor ...
- 【转载】Sql Server参数化查询之where in和like实现详解
文章导读 拼SQL实现where in查询 使用CHARINDEX或like实现where in 参数化 使用exec动态执行SQl实现where in 参数化 为每一个参数生成一个参数实现where ...
- python基础之Day10
一.函数的返回值 1.什么是返回值返回值是一个函数的处理结果, 2.为什么要有返回值如果我们需要在程序中拿到函数的处理结果做进一步的处理,则需要函数必须有返回值 3.函数的返回值的应用函数的返回值用r ...