依稀记得当年有人问我,为啥在C#和Java之间选择了C#,我就插科打诨道:连C++都有auto这种类型推导了,Java还没有,不符合我这种懒鬼的核心价值观……
何谓类型推导?
如果大家有接触一些其他的高级语言,应该会在定义变量时看到类似于“var”、“auto”之类的关键字,其核心作用就是根据等号右边给出的类型自动推导出该变量的类型,从而达到节约篇幅的目的。
可能有些朋友不太理解,不就多打点代码而已么,能费多大的劲?在这里我举一个相对来说典型一点的例子:
1 2 3 4 5 6 7 8 9 |
@Override public Map<String, AnalysisModule.AnalysisProvider<AnalyzerProvider<? extends Analyzer>>> getAnalyzers() { Map<String, AnalysisModule.AnalysisProvider<AnalyzerProvider<? extends Analyzer>>> extra = new HashMap<String, AnalysisModule.AnalysisProvider<AnalyzerProvider<? extends Analyzer>>>(); //Java7开始可以将右边的部分简写,如下 Map<String, AnalysisModule.AnalysisProvider<AnalyzerProvider<? extends Analyzer>>> extra = new HashMap<>(); extra.put("ik_smart", IkAnalyzerProvider::getIkSmartAnalyzerProvider); extra.put("ik_max_word", IkAnalyzerProvider::getIkAnalyzerProvider); return extra; } |
这是一段elasticsearch的ik插件的函数,可以看到函数体第一行代码看起来比较冗长,虽然后来的新语法也支持将右边的泛型简写,但是依旧和其他主流语言有一定的不同之处;再或者说,String的split函数,其实我们大家都知道它会返回String[]类型的结果,然而我们依旧要在等号左边明确写出String[],可能10行、100行代码看不出有什么冗余,那么如果是1W行,10W行的代码呢?
这个话题在社区里也经常被拿来讨论,甚至还出现了 https://projectlombok.org/features/val 这样的项目,一派人认为现在主流的高级语言基本都支持类型推导了,可以节约不少的代码篇幅,而另一派认为这就是Java的特色,不该过分和其他语言同化。
Java 10带来的礼物
猛然发现Oracle官网在前不久放出了JDK 10,好奇心驱使我想去看看增加了哪些新东西,当我看到第一行 “1. JEP 286: Local Variable Type Inference” 的时候我就已经控制不住我的麒麟臂将它下载下来了,没错,Java的“var”!看下图这段代码会不会有种在看C#的感觉呢?至少在我看来,这是自Java加入lambda后,让我再次感到很有意思的地方。
感慨一下
年轻的时候以为,我可能这辈子都不会去用C#以外的其他语言了,它看起来是如此的优美,各种语法糖能甜到我心坎里面去。
但是随着时间的推移,我发现我慢慢从一个理想主义者变成了一个实用主义者,以前追求美观,追求代码如诗;现在反而觉得,解决问题才是真的应该放在第一位的东西。
跟Shuax学了一圈的C下来,我发现C也有它美妙的地方;用了一把SpringMVC跟RxJava之后,发现java也有它的过人之处;摸了一把Tensorflow之后才发现python如此暴力;
这几年微软如打了鸡血一般捣鼓.net core跨平台,2年多的时间从alpha一路飙到2.0,一步一步地将C#从Windows带向linux、macOS甚至安卓;而JDK也一路狂奔,从1.8到9再到10,加入不少相当实用的东西;
不难发现,不论是java、.net还是c++,它们的缔造者们都在努力让这些东西变得更好,都在尝试解决长久以来被人诟病的问题,那么我们作为其使用者,与其蹲在井里高枕无忧,为何不换个角度,看看这些改变呢?
借用一句老话:生活从来都不缺少美,只是缺少发现美的眼睛。