Tại sao nên sử dụng Scala trên Java


16

Tôi hoàn toàn thích Scala như một ngôn ngữ ... và tôi vẫn đấu tranh với lý do tại sao bất kỳ công ty nào cũng nên chuyển từ Java sang Scala. Có phải Scala chỉ là đường tổng hợp trên JVM hay có những cải tiến cơ bản trong Scala trên Java để cải thiện các ứng dụng trong thế giới thực?


4
Điều này đã có một bản sao ở đâu đó.

2
Có vẻ như bạn đã sử dụng nó (Scala) rất nhiều (tốt, hơn tôi) - bạn đã tìm thấy gì trong trải nghiệm cá nhân của mình?
Thất vọngWithFormsDesigner

Tôi đã thấy những câu hỏi như ... Các nhà phát triển Java nghĩ gì về Scala, Tôi nên làm gì tiếp theo với tư cách là một nhà phát triển Java, Làm thế nào để tôi bắt đầu quá trình di chuyển từ Java sang Scala ... nhưng tôi không thấy câu hỏi nào cả một câu trả lời tập trung vào các lý do thúc đẩy sử dụng Scala làm ngôn ngữ lập trình để phát triển thế giới thực.
Bắc Dakotah

1
@delnan, ít nhất là trên SO: stackoverflow.com/questions/6073517/ . @DakotahNorth, vui lòng không đăng bài giữa các trang SE - chọn diễn đàn phù hợp nhất với câu hỏi của bạn và chỉ đăng ở đó. Trên các trang web khác, bài đăng của bạn sẽ bị đóng lại bằng mọi cách, giống như đã xảy ra với trang đó trên SO.
Péter Török

1
Đây là một bản sao khác, gần như chính xác trên SO, với câu trả lời tuyệt vời: stackoverflow.com/questions/2683914/iêu
Péter Török

Câu trả lời:


19

Tuyên bố miễn trừ trách nhiệm: Tôi không phải là một đạo sư Scala.

Scala thực hiện hai điều cực kỳ tốt mà Java (hiện tại) không làm được.

Giải quyết các vấn đề chức năng

  • Ở cấp độ cơ bản nhất, Scala đã đóng cửa hoàn toàn với sự hỗ trợ của bộ sưu tập. Điều này có nghĩa là bạn không còn phải viết mã tấm nồi hơi như (không biết xấu hổ đã xé một bài đăng 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;
    }

Nhưng thay vào đó hãy viết một cái gì đó như:

def bought(user: User) = items.filter(user bought _)
  • Có nhiều tình yêu chức năng hơn, nhưng tôi không đủ điều kiện để nói về nó vì hiện tại tôi vẫn còn mải mê lập trình chức năng :)

Giải quyết đồng thời một cách an toàn hơn

  • Scala có một mô hình diễn viên (+ một số tính tốt khác) vốn an toàn hơn so với dữ liệu có thể thay đổi của Java + khóa trên mô hình Thread (cho dù libs có tốt đến đâu, Java vẫn bị cản trở bởi ngôn ngữ).

Thành thật tôi không thể nghĩ ra quá nhiều thứ khác khiến Scala đứng đầu và vai trên Java. Có rất nhiều lợi ích nhỏ và cải tiến có, nhưng cũng có nhiều dây hơn để treo mình với. YMMV

HTH một chút


3
Tôi muốn chỉ ra rằng akka (mô hình diễn viên) có sẵn cho cả Scala và Java. Xem akka.io
Giorgio

5
Tôi thích Scala và tôi đang chuyển sang Java từ Java. Tuy nhiên, điều đó làm tôi bực mình khi so sánh Java và Scala và các nhà phát triển Scala cố gắng viết mã dài dòng và mã Java nhiều dòng nhất có thể và cố gắng hết sức để thay thế nó bằng một lớp lót Scala. Không mất khả năng đọc trên mã Java có thể nằm gọn trong 5 dòng, không phải 12
mờ

2
"Có rất nhiều lợi ích nhỏ và cải tiến có, nhưng cũng có nhiều dây hơn để treo mình với." +1
Cướp

@lucek Đặc biệt vì đoạn trích sử dụng quy ước niềng răng xoăn của C thay vì Java: P
Andres F.

@robjb: "Có rất nhiều lợi ích nhỏ và cải thiện có, nhưng cũng có nhiều dây hơn để treo mình với." Tôi không đồng ý rằng Scala cung cấp cho bạn nhiều dây hơn để treo mình. Ít nhất, không có lời giải thích nào cho câu trả lời này trong câu trả lời và tôi không thể tự mình nhìn thấy. Ngoài ra, Scala không chỉ giới thiệu một vài thành ngữ chức năng trên đầu ngôn ngữ OO (ví dụ như C # và Java 8), nó cố gắng tích hợp OOP và FP vào một mô hình. IMHO đây không phải là "những cải tiến nhỏ" mà là một công tắc mô hình.
Giorgio

9

Điều đó phụ thuộc vào định nghĩa của bạn về "đường cú pháp". Chẳng hạn, Java theo cách nào hơn là chỉ cú pháp so với mã máy?

Bất kỳ ngôn ngữ nào cũng có thể làm ít hơn mã máy, nhưng không ngôn ngữ nào có thể làm được nhiều hơn.

Những ngôn ngữ cấp cao mang đến cho bảng là làm cho mã dễ đọc và dễ hiểu hơn, dễ soạn thảo hơn và bắt được nhiều lỗi hơn. Và, theo tôi, đây là lần đầu tiên tạo ra sự khác biệt - chính xác là "chỉ là đường cú pháp".

Nhưng chỉ xem xét hai thứ kia, vẫn có những lợi thế của Scala so với Java.

Không tin vào quan điểm, nhưng có các bao đóng làm cho mã có thể kết hợp nhiều hơn là không đóng. Và trong khi Java 7 sẽ thêm một cái gì đó gọi là bao đóng, chúng sẽ không như vậy - chúng sẽ chỉ là các hàm ẩn danh.

Đối với việc bắt được nhiều lỗi hơn, việc xử lý phương sai vượt trội của Scala là bằng chứng đủ để nó làm như vậy. Hơn nữa, sự nhấn mạnh của nó vào tính bất biến cũng ngăn ngừa tất cả các loại lỗi - không phải là Java không thể làm bất biến, nhưng nó không đi kèm với thư viện để làm như vậy.


4
Trên thực tế, 'đóng cửa' của Java sẽ không xuất hiện cho đến Java 8
Martijn Verburg

1
@Martijn Cảm ơn đã sửa. Tại thời điểm này, tôi không thực sự quan tâm nữa.
Daniel C. Sobral

1
Tôi muốn nói rằng đường cú pháp chỉ là cú pháp thay thế trên đầu ngữ nghĩa hiện có. Do ngữ nghĩa của mã máy không bao gồm các đối tượng, các lớp, v.v., tôi nghĩ rằng Java không chỉ là cú pháp cú pháp so với mã máy. Các mô hình ngữ nghĩa và lập trình là khác nhau.
Giorgio

@Martijn Verburg: Java đã có một dạng đóng cửa (dưới dạng các lớp bên trong ẩn danh). Những gì nó thiếu là các hàm ẩn danh (có thể được coi là các lớp ẩn danh đặc biệt với chính xác một phương thức và một số cú pháp đặc biệt).
Giorgio

@Giorgio - đúng, nhưng lớp bên trong anon hoạt động kém so với triển khai dựa trên inv invocate sắp tới và thật tốt, mã nguồn xấu IMO :-)
Martijn Verburg

2

Trên đầu câu trả lời của Martijn, tôi muốn nói thêm rằng Scala có tính biểu cảm hơn Java và lợi ích là (1) nó giúp bạn làm việc hiệu quả hơn (2) viết ít mã hơn để giải quyết vấn đề tương tự có nghĩa là bạn có thể giảm các lỗi trong mã (mã IMHO không có lỗi là một huyền thoại).


0

Tôi đã sử dụng Scala khoảng 3 tháng nay và vẫn không thể tìm thấy bất cứ điều gì tôi không thể làm trong Java. Đối với tôi theo nghĩa đen mỗi tài liệu về Scala dường như đề cập đến những điều tương tự soạn sẵn . Nếu những gì bạn đang tìm kiếm là giảm nồi hơi thì Scala dành cho bạn nhưng IMHO, ví dụ, ví dụ về bộ lọc được đưa ra ở trên cũng có thể được giải quyết bằng cách sử dụng các bộ sưu tập apache

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

hoặc sử dụng đóng cửa như vậy

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

Nhưng tất nhiên dài dòng hơn. Tôi thích kiểu suy luận mặc dù. Khi bạn học Scala, bạn sẽ nhận ra rằng đây có lẽ là những gì đang diễn ra. Theo tôi, mỗi ngôn ngữ đi kèm với + ve và -ve.


-3

danh sách hiểu, cho hiểu.

ví dụ trong java bạn viết:

int myVar;
if (condition) {
  myVar = //some value
}
else {
 myVar = //some other value
}

Trong scala, cùng một mã, được viết thanh lịch hơn nhiều (như python) như:

int myVar = (//some value) if (condition) else // other value;

và thực hiện.

Có rất nhiều thứ mà Scala cung cấp mà Java không có. Đơn giản là không có sự so sánh nào cả. Vấn đề duy nhất là mọi người quen thuộc hơn với Java (b / c đó là những gì họ dạy trong các lớp CS) và chưa thành thạo với mô hình Scala.

Scala có đệ quy đuôi, nó có thể trả về các bộ dữ liệu (một cái gì đó có thể sẽ đến trong Java 8 tôi nghĩ).

Không có so sánh. Scala được phát triển bởi Martin Orderky, người đã làm việc trong nhóm nòng cốt cho Java Generics.

Scala chỉ là một ngôn ngữ vượt trội. Thats tất cả để có nó. Những người nói cách khác chỉ đơn giản là chưa khám phá Scala đủ để biết rõ hơn.

Ở trên, tôi muốn nói là tối ưu hóa đệ quy đuôi (mà JVM không thể làm theo cách mà trình biên dịch của Scala có thể).

Scala cũng biên dịch và chạy nhanh hơn các ứng dụng JVM (Vâng, đó là sự thật). Không đề cập đến các khung. Chúng tôi sử dụng Tomcat chẳng hạn và triển khai một số dịch vụ để xử lý REST.

Một điều Tomcat không thể làm, là các hoạt động không đồng bộ yêu cầu I / O không chặn. Đối với điều này, các nhà phát triển JAVA thường phát minh ra cách giải quyết bằng cách sử dụng hàng đợi tin nhắn (gửi tin nhắn đến hàng đợi và một số quy trình hoặc chuỗi khác chọn nó và làm bất cứ điều gì bạn muốn trong nền).

Thật không may, phương pháp này là cr * p và một bản hack về những hạn chế của việc triển khai các máy chủ Java trên Tomcat.

Đi kiểm tra akka + xịt. Nó sử dụng Diễn viên của Scala (Diễn viên giống như Chủ đề, ngoại trừ cách duy nhất họ có thể giao tiếp là qua tin nhắn).

Và thực hiện, các cuộc gọi REST không đồng bộ được thực hiện dễ dàng. Nhiệm vụ nền dài hạn? Không vấn đề gì. Chỉ cần bắn và quên, và thực hiện một số bỏ phiếu REST để kiểm tra trạng thái của nó từ giao diện người dùng một lần trong một thời gian.

Nếu bạn vẫn đang sử dụng Java và nghĩ rằng nó tốt hơn scala, bạn cũng có thể ngừng sử dụng máy tính của mình để gõ và quay lại thời của bút lông và viết dưới ánh nến. Java về cơ bản là antediluvian so với Scala.


4
Đây không phải là một ví dụ về sự hiểu biết danh sách. Và trong Java bạn viết:int myVar = condition ? someValue : otherValue
kevin cline

1
Bạn nên chỉnh sửa những //some value //other valuebình luận đó để tạo /*some value*/phong cách hoặc những cái gì đó. Hiện tại nó đang làm rối việc tô sáng cú pháp của bạn: p
KChaloux
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.