我完全沉迷于Scala作为一种语言……但我仍然为为什么任何公司都应该从Java转向Scala而感到困惑。Scala仅仅是在JVM之上的语法糖,还是Scala在Java上有根本的改进,可以改善现实世界的应用程序?
我完全沉迷于Scala作为一种语言……但我仍然为为什么任何公司都应该从Java转向Scala而感到困惑。Scala仅仅是在JVM之上的语法糖,还是Scala在Java上有根本的改进,可以改善现实世界的应用程序?
Answers:
免责声明:我不是Scala专家。
Scala在Java(当前)还没有做到的两件事上做得非常好。
解决功能问题
在最基本的层面上,Scala具有完整的闭包支持集合。这意味着您不再需要编写样板代码,例如(无耻地撕下DZone帖子)
public List<Item> bought(User user)
{
List<Item> result = new ArrayList();
for (Item item : currentItems)
{
if (user.bought(item))
{
result.add(item);
}
}
return result;
}
但是改为写类似:
def bought(user: User) = items.filter(user bought _)
以更安全的方式解决并发
老实说,我无法想到让Scala脱颖而出并超越Java的其他事情。是的,虽然有很多小小的收获和改进,但是还有更多的绳索可以帮助您。青年汽车
HTH一点
那取决于您对“只是语法糖”的定义。例如,Java不仅以语法糖代替机器代码,还以什么方式?
任何语言都可以做到少比机器代码,但没有语言可以做得更多。
高级语言带来的好处是使代码更易于阅读和理解,更易于编写以及捕获更多错误。而且,在我看来,这是其中第一个产生最大差异的-正是“只是语法糖”。
但是仅考虑其他两个,Scala仍然具有优于Java的优势。
不必太在意这一点,但是拥有闭包比没有闭包可以使代码更容易组合。尽管Java 7会添加一些叫做闭包的东西,但事实并非如此-它们只是匿名函数。
至于捕获更多错误,Scala出色的方差处理足以证明了这一点。此外,它对不变性的强调还可以防止各种错误-不是Java不能做到不变,而是库没有做到这一点。
除了Martijn的答案外,我想补充一点,Scala 比Java 具有更高的表现力,其好处是(1)它使您更有效率(2)编写更少的代码来解决相同的问题,这意味着您可以减少代码中的错误代码(恕我直言,没有错误的代码是神话)。
我已经使用Scala大约3个月了,但仍然找不到我用Java无法完成的工作。对我来说,字面上斯卡拉每文学似乎提同样的事情样板。如果您正在寻找的是减少样板,那么Scala适合您,但是恕我直言,例如上面给出的过滤器示例也可以使用apache集合来解决
<T> CollectionUtils.filter(Predicate<T>...)
或像这样使用闭包
<T> CollectionUtils.forAllDo(..., Closure<T>)
但是,当然更冗长。我喜欢类型推断。在学习Scala时,您会意识到,这可能是引擎盖下正在发生的事情。我认为,每种语言都带有+ ve和-ve。
列出理解力,以获得理解力。
例如在Java中,您编写:
int myVar;
if (condition) {
myVar = //some value
}
else {
myVar = //some other value
}
在scala中,相同的代码更加优雅地编写(例如python),如下所示:
int myVar = (//some value) if (condition) else // other value;
并做了。
Scala提供了很多Java不能提供的功能。根本没有可比性。唯一的问题是人们更熟悉Java(b / c就是他们在CS类中教的东西),而不是熟练掌握Scala范例。
Scala具有尾递归,它可以返回元组(我认为Java 8中可能会出现这种情况)。
没有可比的。Scala由Martin Java核心团队的Martin Ordersky开发。
Scala只是一种优越的语言。这里的所有都是它的。否则的人只是对Scala的探索不足以了解更多。
上面,我的意思是说尾部递归优化(JVM无法像Scala的编译器那样实现)。
Scala的编译和运行也比JVM应用程序快(是的,这是事实)。更不用说框架了。我们以Tomcat为例,并部署一些小服务器来处理REST。
Tomcat无法做到的一件事是需要非阻塞I / O的异步操作。为此,JAVA开发人员通常发明了一种使用消息队列的解决方法(将消息发送到队列,然后其他进程或线程将其拾取并在后台执行您想要的任何操作)。
不幸的是,这种方法是cr * p,是对在Tomcat上部署Java servlet的局限性的一种破解。
去看看akka + spray。它使用scala的Actor(Actor就像Threads一样,除了它们可以通过消息进行通信的唯一方式)。
完成后,异步REST调用变得容易。长期运行的后台任务?没问题。只是开火而忘记,然后不时进行一些REST轮询以从前端检查其状态。
如果您仍在使用Java并且认为它比scala更好,那么您最好停止使用计算机进行打字,并回到羽毛笔和烛光下书写的时代。与Scala相比,Java基本上是先行的。
int myVar = condition ? someValue : otherValue
//some value
//other value
注释以设置/*some value*/
样式。当前正在弄乱您的语法高亮显示:p