Java 10 实战第 1 篇:局部变量类型推断

转载自   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() {// 表达式1List<String> list1 = new ArrayList<>();list1.add("javastack");// 表达式2var list2 = new ArrayList<>();list2.add(2018);// 表达式3var 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 = newDefaultServiceUnavailableRetryStrategy();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

可以看出 javastack1javastack2 都是虚拟机所认识的的本地变量类型: java.lang.String,虚拟机并不认识 var, 所以 var 并不神奇。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/328291.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【GitLab】与idea的搭配

【GitLab】与idea的搭配 2018年04月27日 18:07:48 星小丫头辰 阅读数&#xff1a;2167 版权声明&#xff1a;很多博客都参考或者直接转载自网络&#xff0c;如有不便&#xff0c;请告知 https://blog.csdn.net/ma15732625261/article/details/80111356 前言&#xff1a; 由截…

Lind.DDD.RedisClient~对StackExchange.Redis调用者的封装及多路复用技术

两雄争霸 使用StackExchange.Redis的原因是因为它开源&#xff0c;免费&#xff0c;而对于商业化的ServiceStack.Redis&#xff0c;它将一步步被前者取代&#xff0c;开源将是一种趋势&#xff0c;商业化也值得被我们尊重&#xff0c;毕竟人家研究代码也不容易&#xff0c;做商…

php处理j数组,PHP Bean 类处理 数组处理

安装&#xff1a;composer require marstm/bean可以实现数据类型约束功能&#xff0c;形参约束&#xff0c;一次定义方便后期数据管理。ArrayList配置bean做数据处理ArrayList文档在使用类里面直接引入MarstmBeannamespace Marstm\Test;use Marstm\Bean;class TestJBean{use Be…

银行营业网点管理系统——implt包(CityAreaDaoImpl )

package BranchesMgr.dao.impl; /*** 城区的实现类*/ import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List;import BranchesMgr.dao.BaseDao; import BranchesMgr.dao.CityAreaDao; import BranchesMgr.entity.CityA…

高可用高并发的 9 种技术架构

转载自 高可用高并发的 9 种技术架构1、分层 分层是企业应用系统中最常见的一种架构模式&#xff0c;将系统在横向维度上切分成几个部分&#xff0c;每个部分负责一部分相对简单并比较单一的职责&#xff0c;然后通过上层对下层的依赖和调度组成一个完整的系统。 在网站的分层…

.NET CoreCLR开发人员指南(上)

1.为什么每一个CLR开发人员都需要读这篇文章 和所有的其他的大型代码库相比&#xff0c;CLR代码库有很多而且比较成熟的代码调试工具去检测BUG。对于程序员来说&#xff0c;理解这些规则和习惯写法非常的重要。 这篇文章让所有的CLR开发者都尽量能在较少知识的情况下&#xff0…

git 拉取gitlab代码

博客园首页新随笔联系管理订阅 随笔- 71 文章- 2 评论- 0 使用git在gitlab上拉取代码的方法 最近在项目中用到了gitlab,他是一个类似于github的代码托管工具。 因为是第一次使用还不太熟悉&#xff0c;所以在此记录一下。 1、首先需要使用github的注册账号登录gitlab,查…

从oracle里面取直,45个非常有用的 Oracle 查询语句小结

日期/时间 相关查询1.获取当前月份的第一天运行这个命令能快速返回当前月份的第一天。你可以用任何的日期值替换 “SYSDATE”来指定查询的日期。代码如下:SELECT TRUNC (SYSDATE, MONTH) "First day of current month"FROM DUAL;2.获取当前月份的最后一天这个查询语句…

Spring Boot 集成 Mybatis 实现双数据源

转载自 Spring Boot 集成 Mybatis 实现双数据源这里用到了Spring Boot Mybatis DynamicDataSource配置动态双数据源&#xff0c;可以动态切换数据源实现数据库的读写分离。 添加依赖 加入Mybatis启动器&#xff0c;这里添加了Druid连接池、Oracle数据库驱动为例。 <depe…

.Net Core及.Net Standard主要概念回顾

在.Net Core之前&#xff0c;选择编译目标是一个相对简单的操作。现在&#xff0c;开发人员面临多种可能&#xff0c;选择一个目标不再那么显而易见了。要想对.Net Core有一个全面的了解&#xff0c;就要了解两个主要的概念&#xff1a;“目标框架别名&#xff08;Target Frame…

如何在Intellij IDEA中集成Gitlab

如何在Intellij IDEA中集成Gitlab 2018年06月11日 16:05:14 葬月魔帝 阅读数&#xff1a;9747 据说在微软收购github当天&#xff0c;一大批用户纷纷转向了gitlab和bitbucket&#xff0c;这两者也都是比较不错的代码托管网站&#xff0c;针对个人和企业都有对应的免费和收费版…

linux更改桌面壁纸的脚本,自动更换桌面壁纸的脚本,支持Ubuntu 18.04系统

下面提供一个自动更换桌面壁纸的脚本&#xff0c;它支持Ubuntu 18.04、UbuntuKylin 18.04、Ubuntu Mate系统。注意事项&#xff1a;1.默认的壁纸通常在目录路径为/usr/share/backgrounds中&#xff0c;如果不是请自行修改&#xff0c;不影响脚本的使用效果&#xff0c;注意目录…

推荐一个实用的 .gitignore 文件

转载自 推荐一个实用的 .gitignore 文件为什么要忽略文件&#xff1f; 常用的版本控制工具&#xff0c;不管是使用 git 还是 svn&#xff0c;我们都需要排除一些与程序代码无关的文件&#xff0c;如像 eclipse/ intellij idea 等 IDE 工具留下来的 .settings、 .classpath、…

应用工具 .NET Portability Analyzer 分析迁移dotnet core

大多数开发人员更喜欢一次性编写好业务逻辑代码&#xff0c;以后再重用这些代码。与构建不同的应用以面向多个平台相比&#xff0c;这种方法更加容易。如果您创建与 .NET Core 兼容的.NET 标准库&#xff0c;那么现在比以往任何时候都更接近于这一现实。 但是&#xff0c;现有的…

idea安装插件plugin(主要针对网络连接不上的情况)

idea安装插件plugin(主要针对网络连接不上的情况) 2018年04月27日 11:07:36 多机智 阅读数&#xff1a;10097 STEP1: ctrl alt s 打开settings STEP2: 在输入框键入 Plugins STEP3: 输入你想要的插件名称&#xff0c;我这边输入的是nodejs,因为最近在学(我这边是安装过…

linux打开服务iis,如何在Linux中引导时列出启动服务?

根据不同的启动系统&#xff0c;查找启动服务的列表会有所不同。Systemd是主要新版本Linux发行版的默认启动系统。如果您的系统使用systemd系统管理器&#xff0c;您可以使用以下命令列出所有服务。$ sudo systemctl list-unit-files --typeservice如上所述&#xff0c;这个命令…

银行营业网点管理系统——Servlet包(CityAreaServlet )

package BranchesMgr.servlet; /*** 城区表的Servlet*/ import java.io.IOException; import java.io.PrintWriter; import java.util.List;import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; im…

.NET Core中使用Razor模板引擎

一、简介 在MVC以外的场景中&#xff0c;我们往往需要完成一些模板引擎生成代码或页面的工作&#xff1b;在以前我们一般常用的有Razor、NVeocity、VTemplate。虽然所有的模板系统都具有一些共同特征&#xff0c;但 Razor却和我们前面讨论的二种视图引擎截然不同。不同于其它视…

idea中Gitlab项目导入导出

idea中Gitlab项目导入导出 2018年04月16日 16:39:23 蓝之刃 阅读数&#xff1a;15415 Gitlab的使用 Gitlab跟Github类似&#xff0c;都是代码托管的网站&#xff0c;最大的不同是Gitlab创建的项目可以免费私有的&#xff0c;不必像Github那样收费&#xff0c;而且Gitlab还可…

服务器 ha linux,Linux 高可用(HA)集群之Heartbeat详解

大纲一、Heartbeat 的定义二、Heartbeat 的版本与组件三、Heartbeat 的各版本之间的区别四、Heartbeat 集群的一般拓扑图推荐阅读&#xff1a;一、Heartbeat的定义Heartbeat 项目是 Linux-HA 工程的一个组成部分&#xff0c;也是目前开源HA项目中最成功的一个例子&#xff0c;L…