简介

java以面向对象的特性显著于世并得到了蓬勃的发展。在语言的发展过程中,为了让java语言更加简洁和方便使用,JDK也在不断的进行改进。

今天本文将要介绍一下JDK10中引入的本地变量类型var。

为什么我们需要var

类型推断是很多编程语言都具有的特性,编译器可以在我们不指定具体变量类型的情况下推断出该变量的实际类型。

类型推断的出现,可以让程序员的代码更加灵活,利于维护和编写。其实我们一直都有使用到类型推断。

更多内容请访问www.flydean.com

JDK8中引入的lambda表达式就是类型推断的一个非常有用的例子:

int maxWeight = blocks.stream().filter(b -> b.getColor() == BLUE).mapToInt(Block::getWeight)
.max();

上面的例子中blocks是一个Stream类型,在filter中使用到的b实际上就没有指定其类型,它的类型是从Stream中推断出来的。

再看一个线程池的例子:

ExecutorService executorService= Executors.newSingleThreadExecutor();
Runnable runnable=new Runnable() {
@Override
public void run() {
log.info("inside runnable");
}
};
executorService.submit(runnable);

很多时候,我们从变量的名字就已经知道了这个变量到底是什么类型的,那么上面的例子如果用var来改写就可以像这样:

var executorService= Executors.newSingleThreadExecutor();
var runnable=new Runnable() {
@Override
public void run() {
log.info("inside runnable");
}
};
executorService.submit(runnable);

代码更加简洁,程序员写起来也更加方便。

如果上面的例子还不能够提起你使用var的兴趣,那么下面的例子你一定很乐意使用var了。

假如我们有一个非常非常长的类名:

ItIsAVeryLongNameJavaClass itIsAVeryLongNameJavaClass= new ItIsAVeryLongNameJavaClass();

写起来是不是超级麻烦,代码看起也非常冗余,这时候我们就可以将其简化为:

var itIsAVeryLongNameJavaClass= new ItIsAVeryLongNameJavaClass();

var使用在什么地方

首先var代表的是本地变量,所以,只有本地变量才能够使用var。

其次var在定义的时候就必须被初始化:

var a;  //Invalid Declaration - - Cannot use 'var' on variable without initializer
var a = 100; //Valid Declaration

var可以用在for loop中:

for ( var element : elementList){
//do something for element
}

或者这种:

for ( var i = 0 ; i < elementList.size(); i++ ){
System.out.println( elementList.get(i) );
}

var不能用在什么地方

因为var是本地变量类型,它不能用在类变量的定义中,不能用在方法变量中,不能用在构造函数中,不能用在方法返回中,不能用在catch变量定义中。

public class VarIncorrectUsage {

    //var user;    //Not allowed as class fields

    //public VarIncorrectUsage(var param){    //Not allowed as parameter
//} /*try{ } catch(var exception){ //Not allowed as catch formal }*/ /*public var returnMethod(){ //Not allowed in method return type
return null;
}*/ /*public Integer parameterMethod( var input ){ //Not allowed in method parameters
return null;
}*/
}

注意,var在JVM无法推断其类型或者可以有很多类型的情况下不能够使用:

var ints = {1, 2, 3};
var lambda = a -> a;
var methodReference = String::concat;

上面例子中数组初始化,lambda表达式和方法引用都是不能用var的。

其他var的特点

var不是关键字,所以我们可以使用var来做变量名字:

var var = 2;   //Valid Declaration

int var = 2;   //Also valid Declaration

因为var是JDK10引入的概念,所以不是向下兼容的。不能够用低版本的编译器来编译var。

var不会影响性能,因为var是在代码编译器进行的类型推断,所以并不会影响到性能。

总结

var是JDK10中引入的一个新的特性,希望大家可以喜欢。

本文的例子https://github.com/ddean2009/

learn-java-base-9-to-20

本文作者:flydean程序那些事

本文链接:http://www.flydean.com/jdk10-var-local-variable/

本文来源:flydean的博客

欢迎关注我的公众号:程序那些事,更多精彩等着您!

JDK10的新特性:本地变量类型var的更多相关文章

  1. C# 9.0 新特性预览 - 类型推导的 new

    C# 9.0 新特性预览 - 类型推导的 new 前言 随着 .NET 5 发布日期的日益临近,其对应的 C# 新版本已确定为 C# 9.0,其中新增加的特性(或语法糖)也已基本锁定,本系列文章将向大 ...

  2. java基础学习总结三(jdk7新特性、变量(局部变量和成员变量)、常量以及运算符)

    一:jdk7新特性 可以表示二进制数值,以0b开头,中间可以使用下划线_分隔符.如下: @Test /** * 测试jdk新特性 */ public void testJdk7(){ int a=0b ...

  3. C#3.0新特性:隐式类型、扩展方法、自动实现属性,对象/集合初始值设定、匿名类型、Lambda,Linq,表达式树、可选参数与命名参数

    一.隐式类型var 从 Visual C# 3.0 开始,在方法范围中声明的变量可以具有隐式类型var.隐式类型可以替代任何类型,编译器自动推断类型. 1.var类型的局部变量必须赋予初始值,包括匿名 ...

  4. C++_新特性2-RTTI运行阶段类型识别

    这部分属于C++的新特性,感觉比较高阶的特性.我把它归于属于奇技淫巧的范畴.了解即可. RTTI是运行阶段类型识别(Runtime Type Identification)的简称. 这是添加到C++中 ...

  5. 字符串格式的方法%s、format和python3.6新特性f-string和类型注解

    一.%s msg = '我叫%s,今年%s,性别%s' %('帅哥',18,'男') print(msg) # 我叫帅哥,今年18,性别男 二.format # 三种方式: # 第一种:按顺序接收参数 ...

  6. H5新特性 本地存储---cookie localStorage sessionStorage

    本地存储的作用 :避免登录网站时,用户在页面浏览时重复登录,也可以实现快速登录,一段时间内保存用户的登录效果,提高页面访问速率 在html5中提供三种数据持久化操作的方法: 1.cookie 可看作是 ...

  7. C# 9.0 新特性之目标类型推导 new 表达式

    阅读本文大概需要 2 分钟. 呼~~,每次过完一个周末,写作就失去了动力,一两天才能缓过来.尽管如此,还是要坚持写好每一篇文章的.宁缺毋滥嘛,宁愿发文的频率低一点,也要保证文章的质量,至少排版不能差, ...

  8. C++11新特性:自动类型推断和类型获取

    声明:本文是在Alex Allain的文章http://www.cprogramming.com/c++11/c++11-auto-decltype-return-value-after-functi ...

  9. c++新特性---引用变量

    一.定义 引用变量是已定义变量的别名,如将ra设置为a的引用变量,则可以使用ra和a交替使用该变量. 表示: int a = 5; int & ra = a; 其中&不是地址运算符,而 ...

  10. c++新特性实验(2)类型特性

    1. 基本类型 1.1 增加 long long long long int signed long long signed long long int unsigned long long unsi ...

随机推荐

  1. Qt开发Activex笔记(三):C#调用Qt开发的Activex控件

    若该文为原创文章,转载请注明原文出处本文章博客地址:https://blog.csdn.net/qq21497936/article/details/113789727 长期持续带来更多项目与技术分享 ...

  2. defaultdict高级用法

    说明 defaultdict数据结构允许调用者提供一个函数,用来在键名缺失的情况下,创建与这个 键对应的值.只要字典发现调用者想要访问的键不存在,就会触发这个函数,以返回应该 与键相关联的默认值 下面 ...

  3. 最经典的TCP性能问题

    目录 问题描述 问题的原因 什么是delay ack 什么是Nagle算法 如果client启用Nagle,并且server端启用了delay ack会有什么后果呢? 再来看一个经典例子和数据分析 回 ...

  4. 读 NebulaGraph源码 | 查询语句 LOOKUP 的一生

    本文由社区用户 Milittle 供稿 LOOKUP 是图数据库 NebulaGraph 的一个查询语句.它依赖索引,可以查询点或者边的信息.在本文,我将着重从源码的角度解析一下 LOOKUP 语句的 ...

  5. 从 Neo4j 导入 Nebula Graph 实践见 SPark 数据导入原理

    本文主要讲述如何使用数据导入工具 Nebula Graph Exchange 将数据从 Neo4j 导入到 Nebula Graph Database.在讲述如何实操数据导入之前,我们先来了解下 Ne ...

  6. Web常见漏洞描述及修复建议(转载)

    Web常见漏洞描述及修复建议 我太难了king 白帽聚集地 1 week ago 1.SQL注入 漏洞描述 Web程序中对于用户提交的参数未做过滤直接拼接到SQL语句中执行,导致参数中的特殊字符破坏了 ...

  7. C 语言字符串操作总结

    C 语言字符串操作总结 一.字符串操作 size_t 是一个无符号整型. 1.1 strcpy 函数原型:char *strcpy(char *dest, const char *src). 功 能: ...

  8. Spring状态机(FSM),让订单状态流转如丝般顺滑

    引言 在复杂的应用程序设计中,尤其是那些涉及多个状态变迁和业务流程控制的场景,有限状态机(Finite State Machine, FSM)是一种强大而有效的建模工具.Spring框架为此提供了Sp ...

  9. Go | Gin 解决跨域问题跨域配置

    Go | Gin 解决跨域问题跨域配置 目录 一.关于跨域解决方案 二.使用步骤 1. 编写一个中间件 2. 使用 3. 注意事项 一.关于跨域解决方案 关于跨域的解决方法,大部分可以分为 2 种 n ...

  10. leetcode算法之Valid Anagram

    原文算法说明如下: Given two strings s and t, write a function to determine if t is an anagram of s. For exam ...