java scala_经过几天的Scala回归Java的10个最烦人的事情

java scala

因此,我正在尝试使用Scala,因为我想编写一个解析器,而Scala Parsers API似乎非常合适。 毕竟,我可以在Scala中实现解析器并将其包装在Java接口后面,因此除了附加的运行时依赖关系之外,应该不存在任何互操作性问题。

在几天后真正真正地习惯了Scala语法的强大功能之后,以下是我回到编写Java时最想错过的十件事:

1.多行字符串

这是我个人的最爱,也是一种非常棒的功能,应该使用任何语言。 甚至PHP都有:多行字符串。 像编写一样简单:

println ("""Dear reader,If we had this feature in Java,
wouldn't that be great?Yours Sincerely,
Lukas""")

这在哪里有用? 使用SQL,当然! 这是使用jOOQ和Scala运行纯SQL语句的方法:

println(DSL.using(configuration).fetch("""SELECT a.first_name, a.last_name, b.titleFROM author aJOIN book b ON a.id = b.author_idORDER BY a.id, b.id""")
)

这不仅对静态字符串有用。 使用字符串插值,您可以轻松地将变量注入到这样的字符串中:

val predicate =if (someCondition)"AND a.id = 1"else""println(DSL.using(configuration)// Observe this little "s".fetch(s"""SELECT a.first_name, a.last_name, b.titleFROM author aJOIN book b ON a.id = b.author_id-- This predicate is the referencing the-- above Scala local variable. Neat!WHERE 1 = 1 $predicateORDER BY a.id, b.id""")
)

太棒了,不是吗? 对于SQL,Scala具有很大的潜力。

jooq在scala-smalll中编写SQL的最佳方法

2.分号

我真心没有错过他们一点。 我构造代码的方式(可能也是大多数人构造代码的方式),Scala似乎根本不需要分号。 在JavaScript中,我不会说同样的话。 JavaScript的解释性和非类型安全性质似乎表明,放弃可选的语法元素可以保证您一臂之力。 但是Scala不支持。

val a = thisIs.soMuchBetter()
val b = no.semiColons()
val c = at.theEndOfALine()

可能是由于Scala的类型安全性导致的,这将使编译器在那些罕见的模棱两可的情况下抱怨,但这只是有根据的猜测。

3.括号

这是一个雷区,在许多情况下,省略括号似乎很危险。 实际上,在调用方法时,您也可以忽略这些点:

myObject method myArgument

由于可能会产生大量歧义,尤其是在链接更多方法调用时,我认为最好避免使用此技术。 但是在某些情况下,“忘记”父母是很方便的。 例如

val s = myObject.toString

4.类型推断

这在Java中确实很烦人,与此同时,似乎许多其他语言也都做到了这一点。 Java仅具有有限的类型推断功能,并且事情并不尽如人意 。

在Scala中,我可以简单地写:

val s = myObject.toString

……而不在乎s是String类型的事实。 有时但仅在某些时候,我想明确指定引用的类型。 在那种情况下,我仍然可以做到:

val s : String = myObject.toString

5.案例分类

我想我想写另一个POJO,它具有40个属性,构造函数,getter,setter,equals,hashCode和toString

-没人说。 曾经

Scala具有案例类。 用单线编写的简单不可变的pojos。 以Person案例类为例:

case class Person(firstName: String, lastName: String)

我同意,必须确实写下一次属性。 但是其他一切应该是自动的。

以及如何创建此类案例类的实例? 轻松,你甚至都不需要new运营商(事实上,它完全逃脱了我的想象,为什么new真正需要摆在首位):

Person("George", "Orwell")

而已。 您还想写些什么以符合企业标准?

边注

好的,现在有些人会争辩说要使用lombok项目 。 基于注释的代码生成是胡说八道,应最好避免。 实际上,Java生态系统中的许多注释简单地证明了Java语言的(而且将永远是)其进化能力非常有限这一事实。 以@Override为例。 这应该是关键字,而不是注释。 您可能会认为这是表面上的区别,但是我说Scala已经证明注释几乎总是错误的工具。 还是您最近看过带有大量注释的 Scala代码?

6.到处都有方法(功能!)

我认为,这实际上是任何语言中最有用的功能之一。 为什么我们总是必须将方法链接到特定的类? 为什么我们不能简单地拥有任何作用域级别的方法? 因为我们可以,所以使用Scala:

// "Top-level", i.e. associated with the package
def m1(i : Int) = i + 1object Test {// "Static" method in the Test instancedef m2(i : Int) = i + 2def main(args: Array[String]): Unit = {// Local method in the main methoddef m3(i : Int) = i + 3println(m1(1))println(m2(1))println(m3(1))}
}

对? 为什么我不能在另一个方法中定义本地方法? 我可以使用Java中的类来做到这一点:

public void method() {class LocalClass {}System.out.println(new LocalClass());
}

局部类是方法局部的内部类。 这几乎没有用,但是真正有用的是局部方法。

JavaScript或REPL也支持这些功能。 这对于在应用程序范围之外测试小型算法或概念非常有用。

在Java中,我们通常倾向于这样做:

public class SomeRandomClass {// [...]public static void main(String[] args) {System.out.println(SomeOtherClass.testMethod());}// [...]
}

在Scala中,我将在REPL中编写以下代码:

println(SomeOtherClass.testMethod)

还请注意始终可用的println方法。 纯金方面高效的调试。

8.数组不是(很多)特例

在Java中,除了基本类型之外,还有一些我们称为数组的怪异事物。 数组起源于一个完全独立的宇宙,在这里我们必须记住起源于柯克上尉(大约)时代的古怪规则:

数组

是的,规则如下:

// Compiles but fails at runtime
Object[] arrrrr = new String[1];
arrrrr[0] = new Object();// This works
Object[] arrrr2 = new Integer[1];
arrrr2[0] = 1; // Autoboxing// This doesn't work
Object[] arrrr3 = new int[];// This works
Object[] arr4[] = new Object[1][];// So does this (initialisation):
Object[][] arr5 = { { } };// Or this (puzzle: Why does it work?):
Object[][] arr6 = { { new int[1] } };// But this doesn't work (assignment)
arr5 = { { } };

是的,清单可以继续。 从语法上讲,使用Scala,数组不再是一种特殊情况:

val a = new Array[String](3);
a(0) = "A"
a(1) = "B"
a(2) = "C"
a.map(v => v + ":")// output Array(A:, B:, C:)

如您所见,数组的行为与其他集合非常相似,包括可以在其上使用的所有有用方法。

9.符号方法名称

现在,这个话题更具争议性,因为它使我们想起了运算符重载的危险 。 但是,每隔一段时间,我们希望有类似的东西。 可以让我们写的东西:

val x = BigDecimal(3);
val y = BigDecimal(4);
val z = x * y

非常直观地,z的值应为BigDecimal(12) 。 那不能太难,对吗? 我不在乎*的实现是否真的是一个称为multiply()的方法。 写下该方法时,我想使用看起来很普通的运算符进行乘法。

顺便说一句,我也想用SQL做到这一点。 这是一个例子:

select ( AUTHOR.FIRST_NAME || " " || AUTHOR.LAST_NAME,AUTHOR.AGE - 10
)
from AUTHOR
where AUTHOR.ID > 10
fetch

那没有道理吗? 我们知道|| 表示concat(在某些数据库中)。 我们知道- (减号)和> (大于)的含义。 为什么不就写呢?

上面是在Scala中的jOOQ的编译示例。

jooq最好的方式在scala中写sql小

注意:警告

允许操作符重载或符号方法名之类的东西总是存在弊端。 它可能(并将被)滥用。 图书馆与Scala语言本身一样多 。

10.元组

作为一个SQL人员,这再次是我在其他语言中最想念的功能之一。 在SQL中,所有内容都是TABLE或ROW。 实际上,很少有人知道这一点 ,并且很少有数据库实际上支持这种思维方式。

Scala没有ROW类型(实际上是记录),但是至少有匿名元组类型。 将行视为具有命名属性的元组,而案例类将命名为行:

  • 元组:具有类型化和索引元素的匿名类型
  • 行:具有类型化,命名和索引元素的匿名类型
  • 案例类:具有类型化元素和命名元素的命名类型

在Scala中,我可以这样写:

// A tuple with two values
val t1 = (1, "A")// A nested tuple
val t2 = (1, "A", (2, "B"))

在Java中,可以完成类似的操作,但是您必须自己编写该库,并且不提供语言支持:

class Tuple2<T1, T2> {// Lots of bloat, see missing case classes
}class Tuple3<T1, T2, T3> {// Bloat bloat bloat
}

然后:

// Yikes, no type inference...
Tuple2<Integer, String> t1 = new Tuple2<>(1, "A");// OK, this will certainly not look nice
Tuple3<Integer, String, Tuple2<Integer, String>> t2 =new Tuple3<>(1, "A", new Tuple2<>(2, "B"));

jOOQ充分利用了上述技术,将SQL的行值表达式带到Java,并且令人惊讶的是,在大多数情况下,您可以在不丢失类型推断的情况下做到这一点,因为jOOQ是一种流利的API,在其中您从未真正将值分配给局部变量。例:

DSL.using(configuration).select(T1.SOME_VALUE).from(T1).where(// This ROW constructor is completely type saferow(T1.COL1, T1.COL2).in(select(T2.A, T2.B).from(T2))).fetch();

结论

当然,这是一篇有关scala的文章,与Java稍有抵触。 不要误会我的意思。 我绝不希望完全迁移到Scala。 我认为Scala语言远远超出了任何有用软件中的合理范围。 有很多看起来不错的小功能和头,但不可避免地会炸掉您的脸,例如:

  • implicit转换。 这不仅很难管理,而且还严重降低了编译速度。 此外,使用implicit合理地实现语义版本控制可能完全是不可能的,因为不可能通过偶然的向后不兼容预见所有可能的客户端代码损坏。
  • 乍一看,本地导入看起来很棒,但是当人们开始部分导入或重命名本地范围的类型时,它们的功能很快使代码难以理解。
  • 符号方法名称最常被滥用。 以解析器API为例,它具有诸如^^^^^^?类的方法名称^?~!

尽管如此,我认为本文中列出的Scala与Java相比的优点也可以全部用Java实现:

  • 几乎没有破坏向后兼容的风险
  • 用(可能)不太大的努力,在JLS方面
  • 对开发人员的生产力产生巨大影响
  • 对Java的竞争力产生巨大影响

无论如何,Java 9将是另一个很有前途的版本,其热门话题包括值类型, 声明站点差异 , 特殊化(非常有趣!)或ClassDynamic。

有了这些巨大的变化,我们希望上面的一些小改进还有一定的余地,这将为日常工作增加更多的直接价值。

翻译自: https://www.javacodegeeks.com/2014/08/the-10-most-annoying-things-coming-back-to-java-after-some-days-of-scala.html

java scala

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

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

相关文章

python区域找图命令_python读取图片任意范围区域

使用python进行图片处理&#xff0c;现在需要读出图片的任意一块区域&#xff0c;并将其转化为一维数组&#xff0c;方便后续卷积操作的使用。 下面使用两种方法进行处理&#xff1a; convert 函数 from PIL import Image import numpy as np import matplotlib.pyplot as plt …

[MEGA DEAL] Ultimate SQL Bootcamp认证捆绑包(98%)

像Pro一样管理任务和数据库&#xff0c;提供有关SQL Lite&#xff0c;Microsoft SQL&#xff0c;MySQL&#xff0c;PostgreSQL&#xff0c;Rest API和Oracle SQL的6门课程 嘿&#xff0c;怪胎&#xff0c; 本周&#xff0c;在我们的JCG Deals商店 &#xff0c;我们提供了另一…

jersey spring_教程–带有Jersey和Spring的Java REST API设计和实现

jersey spring想要在Java中使用REST&#xff1f; 然后您来对地方了&#xff0c;因为在博客文章中&#xff0c;我将向您介绍如何“美丽”地设计REST API&#xff0c;以及如何使用Jersey框架在Java中实现它。 本教程中开发的RESTful API将演示针对存储在MySql数据库中的播客资源的…

html5 css svg,6款基于SVG的HTML5CSS3应用和动画

1、CSS3/SVG质感背景小图标 镂空效果图标按钮今天我们来分享一款用CSS3和SVG实现的质感背景小图标&#xff0c;鼠标滑过图标时出现镂空的效果&#xff0c;并且有质感背景的描边&#xff0c;效果非常不错。2、HTML5 SVG Tab滑块菜单 非常酷的Tab菜单之前我们分享过很多HTML5/CSS…

python 矩阵合并_numpy 的矩阵合并与分割

aiblog4.jpg 这次分享下numpy中矩阵的合并与分割&#xff0c;希望能帮助到大家。 在此附上视频链接 一、引入numpy第三方库 首先我们引入numpy这个第三方库,如果有同学没安装numpy可在命令行中pip install numpy进行安装(Mac用户 sudo pip3 install numpy) import numpy as np …

rto净化效率计算公式_你了解废气处理设备RTO蓄热式热氧化炉的工作原理么?

RTO蓄热式热氧化炉的净化效果以及稳定性都是相当不错的&#xff0c;但是由于其一次性投入成本高&#xff0c;许多企业都选择了放弃。但是科盈小编想要说的是从其99&#xff05;的净化效果、换热系统、新型蜂窝技术以及日后的运行成本费用来看&#xff0c;这个费用就显得很可观了…

Selenium 4相对定位器如何改变您的测试方式?

网页可以包含许多Web元素或GUI元素&#xff0c;例如单选按钮&#xff0c;文本框&#xff0c;下拉菜单&#xff0c;输入等。Selenium自动化测试中的Web定位器用于对页面的Web元素执行不同的操作。 毫不奇怪&#xff0c;作为新的Selenium用户&#xff0c;我们要学习的第一件事是S…

电商 php 颜色数据怎么敲?_来客说电商|电商系统开发注意事项

来客B2B2C多用户电商系统打造支持自营招商入驻经营模式的电商平台&#xff08;类似京东、天猫的经营模式&#xff09;&#xff0c;创新模块化设计整合运营商&#xff0c;供货商&#xff0c;批发商&#xff0c;入驻商&#xff0c;分销商&#xff0c;门店于一体&#xff0c;各个模…

朗读评价语言集锦_英语老师批改作业时的精彩评语集锦,超实用!

01你的作业评语&#xff0c;学生看得懂吗&#xff1f;评语是写给学生看的&#xff0c;所以一方面评语要使用学生能看得懂的英语来写&#xff0c;所使用的词汇和语法不能过高或过低于学生的现有水平&#xff0c;要切合学生的实际情况&#xff0c;符合学生的个性心理发展需要&…

u盘安装linux 提示no such device_Linux 网络基础设计

误删网卡配置文件解决思路本回复案例仅在Centos 7如试验成功其它系统无从考究,仅供参考请在root用户模式下配置获得设备名称DEVICE常见使用ifconfig,如果尚未安装请先安装如果只能找到Io和virbrN(Nnumber),请使用ifconfig -a复制名字(红线处,要以你机器的为准!)创建配置文件tou…

中兴c600olt数据配置_中兴天机Axon 10 Pro再掀波澜,4G版3199元起,5G版还有悬念?...

自MWC 2019大会多家手机厂商纷纷亮出自家的5G手机后&#xff0c;5G时代就已经从想象变为现实。不仅仅是手机终端&#xff0c;关于5G技术、基站建设也早就提上日程。技术的车轮永远比我们的想象快一步&#xff0c;当大家还在议论5G应用场景时&#xff0c;中兴天机Axon 10 Pro 4G…

学计算机二级分数,2020年9月计算机二级考试成绩可以查了 多少分及格

2020年9月份计算机二级考试成绩查询入口已经开通&#xff0c;考生可以在中国教育考试网上进行查询。计算机二级考试满分100分&#xff0c;60分及格。计算机二级成绩查询入口及合格标准全国计算机二级考试成绩查询唯一入口&#xff1a;中国教育考试网全国计算机二级考试实行百分…

怎么能把看不清的照片给看清_远视怎么矫正?需要佩戴眼镜吗?

昆明眼科医院&#xff0c;我们都知道眼睛一旦近视了&#xff0c;世界就变得一片模糊&#xff0c;而为了重新看清东西&#xff0c;我们不得不戴上近视眼镜。 那么反过来&#xff0c;远视需要戴眼镜吗?正常情况&#xff0c;我们出生时眼睛都处于一个远视状态&#xff0c;随着年龄…

cout不明确什么意思_劈腿什么意思?原来出轨和劈腿不一样!原来如此!

我们在生活中经常说&#xff0c;出轨和劈腿。然而&#xff0c;这两个词之间有一定的标准。劈腿原意是体操术语&#xff0c;体操运动员可以做一些困难的动作&#xff0c;如分裂、垂直分裂、水平分裂和半分裂。其中劈腿也被称为分裂&#xff0c;这意味着两条腿被最大程度地分开。…

hbase 生成文件_HBase:为客户行为生成搜索点击事件统计信息

hbase 生成文件在本文中&#xff0c;我们将探索HBase来存储客户搜索点击事件数据&#xff0c;并利用其基于搜索查询字符串和构面过滤器点击来获取客户行为信息。 我们将介绍使用MiniHBaseCluster&#xff0c;HBase Schema设计&#xff0c;使用HBaseSink与Flume集成以存储JSON数…

使用Spring Cloud Gateway保护反应式微服务

朋友不允许朋友写用户身份验证。 厌倦了管理自己的用户&#xff1f; 立即尝试Okta的API和Java SDK。 在几分钟之内即可对任何应用程序中的用户进行身份验证&#xff0c;管理和保护。 所以你想完全反应&#xff0c;是吗&#xff1f; 大&#xff01; 反应式编程是使您的应用程序…

pythonqt4上位机开发_「新阁教育」自由口通信上位机实战案例

1、引言组态软件作为一种通用软件&#xff0c;体系结构较为庞大、功能软件包多、价格也比较昂贵&#xff0c;而且对于一些复杂的业务逻辑或自定义的协议&#xff0c;实现起来比较麻烦。近几年&#xff0c;C#/.NET上位机开发应用越来越广泛&#xff0c;相对于传统的组态软件的方…

判断单链表中的元素是否递增_检测单链表中是否有环(C语言)

检测单链表中是否有环(C语言)方法&#xff1a;双指针法思路使用两个指针&#xff0c;两个初始时都指向链表的头结点&#xff0c;然后one指针一次加一&#xff0c;另一个two指针一次加二。在链表有环时&#xff0c;two指针与one指针相等就说明有环。当one指针到达环的起始位置时…

cad 怎么显示块句柄_cad怎么显示工具栏

大家使用电脑时可能会出现一些小问题&#xff0c;比如cad菜单栏不见了&#xff0c;怎样全屏显示等等问题&#xff0c;有时候不小心操作&#xff0c;导致问题的出现&#xff0c;cad怎么显示工具栏?cad怎么显示工具栏方法一、使用天正自带内部命令步骤1、在最下方的【命令栏】中…

Java 第16章 坦克大战1-2 思路整理

文章目录 1 绘制坦克坦克画板Panel画框Frame 2 让坦克动起来画板Panel 1 绘制坦克 坦克 不同坦克有共同属性&#xff0c;可以先提取共同特征&#xff08;坐标位置&#xff09;作为父类&#xff0c;然后其他坦克类继承它。 画板Panel 有坦克在画板上显示&#xff0c;所以包含…