真是天道好轮回, Java 新特性:用 var 关键字,数据类型可以扔掉了?

2020-09-30 15:00:28 +08:00
 shew5689

//JDK 10 中新增了 var 局部变量推断的功能:

//场景一:定义字符串 //旧写法:

String str = "Hello, Java.";

//新写法:

var s = "Hello, Java.";

//PS:这里的旧写法指的是 JDK 10 之前的版本,而新写法指的是 JDK 10 以后(包含 JDK 10 )的版本。

//场景二:数值相加 //旧写法:

int num1 = 111; double num2 = 555.666d; double num3 = num1 + num2; System.out.println(num3);

//PS:当遇到不同类型相加时( int+ double )会发生数据类型向上转型,因此 num3 就会升级为 double 类型。

//新写法:

var n1 = 111L; var n2 = 555.666; var n3 = n1 + n2; System.out.println(n3);

//场景三:集合 //旧写法:

List<Object> list = new ArrayList<>(); list.add("Hello"); list.add("Java");

//新写法:

var list = new ArrayList<>(); list.add("Hello"); list.add("Java"); //......

//JavaScript:我慢慢靠近你,你慢慢靠近我,你中有我,我中有你,我特么谢谢你~

7924 次点击
所在节点    Java
90 条回复
shew5689
2020-09-30 16:42:42 +08:00
我抖了一下机灵,没想到引来了这么多键盘侠~,有些童鞋说借鉴的是 C#, 从发布时间上面看,C# 比 ECMAScript 晚了 5 年~,搞不好 C#也是借鉴的 ECMAScript



ECMAScript
发行时间 1997 年
型態系統 弱类型、動態
網站 ecma-international.org


C# 1.0
2002 年 1 月
随 Visual Studio 2002 和 .NET Framework 1.0 发布
InkStone
2020-09-30 16:49:48 +08:00
@shew5689 前面已经有人说过了,js (或者 es )的 var 跟 Java/C#/C++的根本不是一回事。

你怎么不说它们都是借鉴 VB 的呢? dim a = 3; 不比 ES 早多了么。
shew5689
2020-09-30 16:51:45 +08:00
@InkStone ECMAScript 中 var 也是作者设计的语法糖啊~
yolee599
2020-09-30 16:54:09 +08:00
习惯了强类型的 C 语言,反而觉得 var 这种类型定义很没踏实感
chocotan
2020-09-30 16:54:42 +08:00
已经 jdk15 了
shew5689
2020-09-30 16:57:23 +08:00
@chocotan 大清的辫子还在你心中。
shew5689
2020-09-30 16:59:16 +08:00
上面的部门键盘侠,就算 jdk15 了,jdk10+的新特性你们了解多少?
gdtdpt
2020-09-30 17:01:19 +08:00
写过 switf 、ts 、js 、golang 之后每次写 Java 的时候都会觉得 Java 的变量声明实在是在啰嗦了,明明可以根据表达式推断变量类型非要在变量前面显式加上类型声明,有些类名字还贼长,虽然 idea 能提示,但是遇到命名相似的类一不小心选错了也很糟心。
neptuno
2020-09-30 17:02:39 +08:00
@cheng6563 new Object().var 也会直接生成
Oktfolio
2020-09-30 17:04:08 +08:00
@shew5689 jdk 11 正式发布就把 9 10 11 新特性完整过了一遍。12 13 14 15 语法上的新特性也都稍微看了看,等 Shenandoah + TLS 直接无脑上新版本。这都 0202 年了,还在说 var ......
digitO
2020-09-30 17:04:42 +08:00
java 转 kotlin 表示真香,java 的代码的确有些繁琐
across
2020-09-30 17:06:54 +08:00
都转去补习 C++吧,一个类型推导早讨论烂了
wmwmajie
2020-09-30 17:07:58 +08:00
然后 java 就变成 PHP 了呗(手动滑鸡)
namelosw
2020-09-30 17:14:06 +08:00
这种类似 C#的局部推导跟 TS 之类的全局推导用起来体验差很多. C#经常抽个带匿名类型的方法就要补半天签名.
woostundy
2020-09-30 17:15:25 +08:00
@shew5689 #41 感人。C#的 var 和 js 的 var 除了都叫 var 还有啥关系?
要说用这单词,1971 年的 Pascal 就有 var 了,要说类型推断 1991 年的 Python 更早。怎么扯也扯不到 js 上。
wupher
2020-09-30 17:21:25 +08:00
@MarioLuo 浅见,仅供参考。

我是新项目使用 Kotlin,包括后端和 Android 。

之前后端使用 Groovy,配合 GORM 以及 Spring 。使用 Kotlin 后强类型语言的好处是,编译阶段能解决 80%的问题。强类型语法检查很犀利。坏处也是有的,Kotlin 的强类型甚至体现在容器及模板类。会给 json 的动态转化带来一些问题:接口传输中的 “1”与 1,是完全不同的类型。你的对象类必须严格符合;而在 Groovy 中没有真正的类型,接口中的"1",你想解释成 String, int, Integer, Long 全看你心情。而接口这东西,又不仅仅靠你自己,也要看对方实现人员的实现和心情。

与 Java 相比 Kotlin 的语法糖更多,且甜。(虽然可能不一定 Groovy 等动态类型那么甜)像修改、扩展类函数,动态生成函数及类,包况 FP,type alias,如果要封装 DDD 框架,也是很方便的。但是总体上,仍然是一种强类型语言。

目前,Kotlin 在低层能带来其它加分,主要是 Coroutines 。但 ReactiveX 本身也很好用了。

综上所述,我个人觉得新项目还是挺适合 Kotlin,旧项目如果是 Java 编写还是照旧吧,我目前也是如此。
haleyao
2020-09-30 17:21:37 +08:00
连我这个对 PL 一无所知的人都知道类型推导,在较“新”的语言里面好像都是标配,比如 dart rust
咋就还扯上 js,php 呢
xxboy 我认为涉嫌语言歧视,我更愿意称为培训班 boy
yazinnnn
2020-09-30 17:24:27 +08:00
不行,还不算好用

A a = str -> { };

var b = str -> { }; //无法推断类型:lambda 表达式需要显式目标类型
shew5689
2020-09-30 17:25:17 +08:00
@haleyao 请问您是哪类 boy?
shew5689
2020-09-30 17:26:43 +08:00
@haleyao 优越感这么强~ 谦虚一点不行~

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/711895

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX