2010-06-11 36 views
12

Điều này rất giống với một câu hỏi khác (Functional Data Structures in Java) nhưng các câu trả lời không đặc biệt hữu ích.java: các thư viện cho các cấu trúc dữ liệu kiểu chức năng bất biến

Tôi cần phải sử dụng các phiên bản bất biến của bộ sưu tập Java tiêu chuẩn (ví dụ: HashMap/TreeMap/ArrayList/LinkedList/HashSet/TreeSet). Bởi "không thay đổi" tôi ngụ ý bất biến theo ý nghĩa chức năng (ví dụ: purely functional data structures), trong đó việc cập nhật hoạt động trên cấu trúc dữ liệu không làm thay đổi dữ liệu gốc, mà thay vào đó trả về một thể hiện mới của cùng một loại cấu trúc dữ liệu. Thông thường, các trường hợp mới và cũ của cấu trúc dữ liệu sẽ chia sẻ dữ liệu không thay đổi để có hiệu quả về thời gian và không gian.

Từ những gì tôi có thể nói lựa chọn của tôi bao gồm:

nhưng tôi không chắc chắn cho dù bất kỳ trong số này là đặc biệt hấp dẫn đối với tôi. Tôi có một vài yêu cầu/desirements:

  • các bộ sưu tập trong câu hỏi nên được sử dụng trực tiếp trong Java (với các thư viện thích hợp trong classpath). FJ sẽ làm việc cho tôi; Tôi không chắc liệu tôi có thể sử dụng cấu trúc dữ liệu của Scala hoặc Clojure trong Java không bằng cách sử dụng trình biên dịch/thông dịch viên từ những ngôn ngữ đó và không phải viết mã Scala hoặc Clojure.

  • hoạt động cốt lõi trên danh sách/bản đồ/bộ nên có thể w/o phải tạo chức năng các đối tượng với cú pháp khó hiểu (FJ trông hơi iffy)

  • Họ nên hiệu quả trong thời gian và không gian. Tôi đang tìm một thư viện lý tưởng đã thực hiện một số thử nghiệm hiệu suất. FJ của TreeMap được dựa trên một cây đỏ-đen, không chắc chắn như thế nào tỷ giá.

  • Tài liệu/hướng dẫn phải đủ tốt để người khác có thể bắt đầu nhanh chóng bằng cấu trúc dữ liệu. FJ thất bại trên mặt trận đó.

Mọi đề xuất?

+0

Ngoài ra còn có https://github.com/blackdrag/pcollections –

Trả lời

6

Dường như với tôi bạn đã biết những gì lựa chọn của bạn, bạn chỉ không hài lòng với bất kỳ người trong số họ. Đây là sự lựa chọn của tôi về ba lựa chọn mà bạn đã cung cấp:

Chức năng Java - Cái này có vẻ phù hợp nhất với bạn. Nó phù hợp với tất cả các yêu cầu của bạn ngoại trừ việc bạn không thích tài liệu. Theo quan điểm của tôi, tài liệu có vẻ cơ bản, nhưng hữu ích.code snippets của họ sẽ giúp bạn bắt đầu và chạy nhanh chóng. Đường cong học tập dường như hầu như không tồn tại, điều này sẽ giúp giảm thiểu sự thiếu tài liệu. FYI, số lõi của Java TreeMap cũng dựa trên cây Đỏ-Đen.

Scala - Đây là lựa chọn tôi sẽ thực hiện nếu tôi ở trong đôi giày của bạn. Bạn dường như không muốn học một ngôn ngữ mới, nhưng Scala là một quá trình chuyển đổi rất dễ dàng từ Java. Bạn có thể viết mã rất giống như java lúc đầu, và từ từ áp dụng các thành ngữ chức năng hơn. Java < -> Scala interop là tuyệt vời trong cả hai hướng là tốt.

Clojure - Nhiều như tôi yêu Clojure, rất khó để đề xuất trong trường hợp cụ thể này do cú pháp hoàn toàn khác và đường cong học tập dốc cho nhà phát triển java.

+0

cảm ơn. Nó không phải là tôi không hài lòng với bất kỳ ai trong số họ, chỉ là tôi không quen thuộc với họ và tiếc là tôi không có nhiều thời gian để đưa ra quyết định sáng suốt (do đó câu hỏi này). Nói chung tôi không ngại học một ngôn ngữ mới nhưng nó áp đặt một ràng buộc đối với bất cứ ai duy trì/xem xét mã của tôi. Tôi nghĩ tôi cũng đang hướng tới Scala; Tôi có "Lập trình trong Scala" trên kệ của tôi, chỉ là tôi không bao giờ có thể có được cú pháp đúng để thực sự sử dụng nó. –

+0

@ Jason S: Tôi nghĩ rằng đầu tư vào Scala sẽ rất đáng để thử. Đó là một ngôn ngữ tuyệt vời. – dbyrne

0

Tôi đã trải qua một thời gian làm cho Clojure dai dẳng/bất biến dữ liệu cấu trúc làm việc trong Java, với nhà thầu hợp lý và Generics như một phần của Pure4J.

Điều này cũng bao gồm @ImmutableValue lớp học để đảm bảo rằng không chỉ là các bộ sưu tập bất biến, nhưng các giá trị bạn đặt trong chúng cũng không thay đổi.

Hy vọng điều này sẽ hữu ích.

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