为什么在Java上使用Scala


16

我完全沉迷于Scala作为一种语言……但我仍然为为什么任何公司都应该从Java转向Scala而感到困惑。Scala仅仅是在JVM之上的语法糖,还是Scala在Java上有根本的改进,可以改善现实世界的应用程序?


4
有重复的地方。

2
听起来您已经使用了很多(Scala)(远远超过了我)- 在个人经历中发现了什么?
FrustratedWithFormsDesigner

我看到过类似的问题……Java开发人员如何看待Scala,作为Java开发人员接下来应该做什么,如何启动从Java到Scala的迁移……但是我从哪里看不到问题或一个针对使用Scala作为现实世界开发的编程语言的驱动原因的答案。
达科他州北部

1
@delnan,至少在SO:stackoverflow.com/questions/6073517/…上。@DakotahNorth,请不要在SE网站之间交叉发布-选择最适合您问题的论坛并仅在此处发布。在其他站点上,您的帖子仍然会被关闭,就像在SO上发生的一样。
彼得Török

1
这里是另一个,几乎完全复制上SO,具有优良的答案:stackoverflow.com/questions/2683914/...
彼得Török

Answers:


19

免责声明:我不是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有一个actor模型(加上一些其他优点),从本质上讲比Java的可变数据+ Thread模型上的锁更安全(无论libs的性能如何,Java仍然受到语言的阻碍)。

老实说,我无法想到让Scala脱颖而出并超越Java的其他事情。是的,虽然有很多小小的收获和改进,但是还有更多的绳索可以帮助您。青年汽车

HTH一点


3
我想指出akka(演员模型)可用于Scala和Java。参见akka.io
乔治

5
我喜欢Scala,并且正在从Java迁移到它。当比较Java和Scala时,Scala开发人员尝试编写尽可能冗长和多行的Java代码,并非常努力地用Scala one-liner替换它,仍然让我感到恼火。在不降低可读性的前提下,Java代码可以容纳5行,而不是12行
哑光

2
“是的,有很多小的收获和改进,但是还有更多的绳索可以让自己垂涎。” +1
Rob

@lucek特别是因为该代码段使用C的花括号约定而不是Java的:P
AndresF。13年

@robjb:“是的,有很多小的收获和改进,但是还有更多的绳索可以让自己垂涎。” 我不同意Scala为您提供更多帮助。至少在答案中没有对此陈述的解释,我自己也看不到。另外,Scala不仅在OO语言(例如C#和Java 8)之上引入了一些功能惯用法,而且还尝试将OOP和FP集成到一个范例中。恕我直言,这不是“小的改进”,而是一种范式转换。
乔治

9

那取决于您对“只是语法糖”的定义。例如,Java不仅以语法糖代替机器代码,还以什么方式?

任何语言都可以做到比机器代码,但没有语言可以做得更多。

高级语言带来的好处是使代码更易于阅读和理解,更易于编写以及捕获更多错误。而且,在我看来,这是其中第一个产生最大差异的-正是“只是语法糖”。

但是仅考虑其他两个,Scala仍然具有优于Java的优势。

不必太在意这一点,但是拥有闭包比没有闭包可以使代码更容易组合。尽管Java 7会添加一些叫做闭包的东西,但事实并非如此-它们只是匿名函数。

至于捕获更多错误,Scala出色的方差处理足以证明了这一点。此外,它对不变性的强调还可以防止各种错误-不是Java不能做到不变,而是库没有做到这一点。


4
其实Java的“倒闭”不来,直到Java的8
的Martijn Verburg

1
@Martijn感谢您的纠正。在这一点上,我实际上不在乎了。
Daniel C. Sobral

1
我要说的是,语法糖只是现有语义之上的替代语法。由于机器代码的语义不包括对象,类等,因此我认为Java 不仅仅是机器代码上的语法糖。语义和编程范例是不同的。
乔治

@Martijn Verburg:Java已经有一种闭包形式(以匿名内部类的形式)。它缺少的是匿名函数(可以将其视为具有一种方法和某种特殊语法的特殊匿名类)。
乔治

@ Giorgio-是的,但是与即将到来的基于invokedynamic的实现相比,anon内部类的表现很差,而且很好,源代码很难看的IMO :-)
Martijn Verburg,2012年

2

除了Martijn的答案外,我想补充一点,Scala 比Java 具有更高的表现力,其好处是(1)它使您更有效率(2)编写更少的代码来解决相同的问题,这意味着您可以减少代码中的错误代码(恕我直言,没有错误的代码是神话)。


0

我已经使用Scala大约3个月了,但仍然找不到我用Java无法完成的工作。对我来说,字面上斯卡拉每文学似乎提同样的事情样板。如果您正在寻找的是减少样板,那么Scala适合您,但是恕我直言,例如上面给出的过滤器示例也可以使用apache集合来解决

<T> CollectionUtils.filter(Predicate<T>...)

或像这样使用闭包

<T> CollectionUtils.forAllDo(..., Closure<T>)

但是,当然更冗长。我喜欢类型推断。在学习Scala时,您会意识到,这可能是引擎盖下正在发生的事情。我认为,每种语言都带有+ ve和-ve。


-3

列出理解力,以获得理解力。

例如在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基本上是先行的。


4
这不是列表理解的示例。在Java中,您可以这样写:int myVar = condition ? someValue : otherValue
kevin cline 2013年

1
您应该编辑这些//some value //other value注释以设置/*some value*/样式。当前正在弄乱您的语法高亮显示:p
KChaloux13年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.