2011-12-22 29 views
13

Tôi muốn sử dụng Java chức năng hoặc ổi (hoặc ít có khả năng là Scala) trong khóa học mà tôi sẽ dạy. Mặc dù có rất nhiều ngôn ngữ chức năng chạy trên JVM Tôi muốn dính vào thứ gì đó giống như Java nhất có thể, tức là, cái gì đó sẽ tương thích nhất, khái niệm và cú pháp, với các tính năng chức năng được mong đợi trong Java 8 .Có so sánh tốt nào giữa Java chức năng và Ổi không?

Có vẻ như Functional JavaGuava là những ứng viên tốt nhất. Tôi đã không thể tìm thấy bất cứ điều gì so sánh chúng về khả năng, dễ sử dụng, gần gũi khái niệm để thẳng Java, vv Có ai biết về một so sánh tốt giữa các thư viện này?

+1

Câu hỏi ở đây là gì? Bạn có thể muốn chỉnh sửa Q của bạn để làm cho nó rõ ràng hơn những gì bạn đang yêu cầu ... \ [edit \] Q là trong tiêu đề, có, nhưng bạn có thể muốn rephrase nó trong Q chính nó. – BenCole

+2

Ổi chỉ là một thư viện Java với nhiều phương pháp tiện ích hữu ích. Có, nó có một số công cụ mà sẽ cho phép bạn lập trình theo cách chức năng, nhưng nó không thực sự đặc biệt tập trung vào lập trình hàm. – Jesper

+0

Cảm ơn câu trả lời dưới đây. Tôi đã hiểu sai mục tiêu của ổi. Tôi cũng đã dành nhiều thời gian hơn để xem chức năng Java. Nó cũng được (vẫn) được cân nhắc bằng cú pháp Java hiện tại. Điều này dẫn tôi đến bây giờ để nghiêng về phía Scala. Tôi nhận ra rằng Scala ngày càng trở nên chủ đạo hơn. Mặc dù vậy tôi nghĩ rằng nó sẽ có giá trị nhất đối với hầu hết sinh viên để học cách lập trình chức năng trong Java thẳng. (Khi chúng tôi dạy chương trình chức năng như một "mô hình", chúng tôi sử dụng Haskell. Tôi nghi ngờ rằng các sinh viên học đủ, mặc dù để có được nó vào trong máu của họ.) Điều đó dẫn đến câu hỏi: khi nào Java 8 dự kiến? – RussAbbott

Trả lời

17

Mục tiêu của ổi không phải là cung cấp các thành ngữ chức năng trong Java. Từ trang wiki Functional Explained Ổi:

sử dụng quá mức của các thành ngữ lập trình chức năng Ổi có thể dẫn đến đang tiết, bối rối, không thể đọc được, và không hiệu quả. Đây là những phần dễ bị tổn thương nhất (và phổ biến nhất) của Guava, và khi bạn đi đến độ dài phi lý để làm cho mã của bạn "một lớp lót", nhóm số ổi phát ra tiếng bíp.

Hãy chắc chắn, khi sử dụng các tiện ích chức năng của ổi, thì cách cách bắt buộc truyền thống để làm việc này không dễ đọc hơn. Hãy thử viết ra. Điều đó thật tệ? Đó có phải là dễ đọc hơn so với phương pháp tiếp cận chức năng lúng túng bạn sắp thử?

Nghiêng quá nhiều vào thành ngữ chức năng không có ý nghĩa quá nhiều đối với Java 7 vì chi phí quá cao (xem vertical problem). Điều này sẽ thay đổi với Java 8 sẽ thay đổi cách các thư viện và chương trình Java được thiết kế ở cấp chi tiết. Những điều có ý nghĩa trong Java lên đến 7 sẽ không được khuyến khích ở một mức độ nào đó trong Java 8. Điều này sẽ thúc đẩy một phiên bản mới của Java hiệu quả và nhiều API mới.

Nếu bạn đang cố gắng dạy chương trình chức năng, có lẽ tốt hơn là nên tuân theo một (hoặc ít hơn) ngôn ngữ chức năng thuần túy. Mỗi ngôn ngữ đó là một melange (hoặc thi đua) của FP và OOP sẽ là một phân tâm.

+3

Tôi cũng nên chỉ ra câu trên trong bài viết đó: "Vì Java 7, lập trình chức năng trong Java chỉ có thể được xấp xỉ thông qua việc sử dụng vụng về và tiết tú của các lớp ẩn danh.Điều này dự kiến ​​sẽ thay đổi trong Java 8, nhưng Ổi là hiện nhắm vào người dùng Java 5 trở lên ". –

6

Như đã nêu ở trên, Ổi chỉ là một thư viện Java - một thư viện tương thích Java 5, thậm chí (như của bản phát hành 11). Vị trí của ổi về lập trình chức năng được tóm tắt bởi Kevin Bourrillion:

“Cú pháp hút. Đồng thời, công cụ này bây giờ, luôn luôn và sẽ luôn là gì, nhưng một biện pháp tạm thời cho đến khi thay đổi ngôn ngữ phù hợp có thể đi cùng, lúc đó chúng ta cuối cùng có thể quyết định cú pháp tối ưu và bắt đầu lập trình theo kiểu chức năng thực sự làm cho cuộc sống tốt hơn trong Java một lần. Vì vậy, tôi chưa quyết định bao nhiêu nỗ lực để đưa vào các công cụ Chức năng/Predicate; Nó nằm trong thư viện nhiều hơn bởi vì nó phải là một viên ngọc vương miện. ”

4

Vì ổi là một thư viện đa mục đích có thành phần chức năng, và hàm Java là hoàn toàn về việc thực hiện các thành phần chức năng trong Java, các hàm Java âm thanh như là phù hợp hơn với một bộ tính năng giống như FP hoàn chỉnh hơn.

Mặt khác, tôi thích Guava là mục đích chung hơn và do đó tôi thấy mình sử dụng một số tính năng không liên quan đến thành ngữ chức năng.

Một trong những vấn đề với cả hai thư viện (như đã lưu ý trên Wiki của Guava trong các bài viết trên) là "tiếng ồn thẳng đứng" của các lớp bên trong vô danh cho các đối tượng chức năng của bạn. Một thư viện khác cố khắc phục điều này thông qua chú thích và APT là Jedi.

Một cách tiếp cận khác làm cho bất kỳ thư viện nào ở trên (ổi, FJ hoặc Jedi) ít ồn ào hơn mà không có chú thích là thư viện mà tôi đã viết, Funcito, lấy cảm hứng từ cú pháp của Mockito. Nó được giới hạn hơn trong những gì nó có thể đơn giản hóa vào thời điểm này, về cơ bản gói các cuộc gọi phương thức duy nhất, nhưng đó là những gì tôi hiện đang thấy mình làm hầu hết thời gian rồi.

+0

Khi bạn có nghĩa là tiếng ồn theo chiều dọc. Bạn đang nói về việc mã hóa chi tiết vì nó liên quan đến việc thêm các lớp bên trong vô danh hoặc phí trên trong các thư viện jar của bạn trong việc tạo ra một loạt các tệp lớp bytecode đó? –

+0

Trước đây: các lớp bên trong vô danh. –

Các vấn đề liên quan