2010-06-11 2 views
12

Это очень похоже на другой вопрос (Functional Data Structures in Java), но ответы там не особенно полезны.java: библиотеки для неизменяемых структур данных функционального стиля

Мне нужно использовать неизменные версии стандартных наборов Java (например, HashMap/TreeMap/ArrayList/LinkedList/HashSet/TreeSet). Под «неизменяемым» я подразумеваю неизменяемость в функциональном смысле (например, purely functional data structures), где операции обновления структуры данных не изменяют исходные данные, а вместо этого возвращают новый экземпляр такой же структуры данных. Также типично новые и старые экземпляры структуры данных будут делиться неизменными данными, чтобы быть эффективными во времени и пространстве.

Из того, что я могу сказать, мои варианты включают в себя:

, но я не уверен, является ли какой-либо из них особенно привлекательным для меня. У меня есть несколько требований/desirements:

  • коллекция в вопросе должна быть доступна непосредственно в Java (с соответствующими библиотеками в пути к классам). FJ будет работать для меня; Я не уверен, могу ли я использовать структуры данных Scala или Clojure в Java без использования компиляторов/интерпретаторов с этих языков и без необходимости писать Scala или Clojure.

  • Основные операции по спискам/карт/наборов должно быть возможным без необходимости создания функциональных объектов с запутанным синтаксисах (FJ выглядит немного ненадежный)

  • Они должны быть эффективными во времени и пространстве. Я ищу библиотеку, которая идеально провела тестирование производительности. FJ's TreeMap основан на красно-черном дереве, не уверен, как это оценивается.

  • Документация/учебники должны быть достаточно хорошими, чтобы кто-то мог быстро начать работу с структурами данных. FJ не работает на этом фронте.

Любые предложения?

+0

Существует также https://github.com/blackdrag/pcollections –

ответ

6

мне кажется, вы уже знаете, что ваши варианты, вы просто не довольны ни одним из них. Вот мой выбор на три варианта, которые вы предоставили:

Функциональная Java - Это похоже на то, что вам лучше всего подходит. Он соответствует всем вашим требованиям, за исключением того, что вам не нравится документация. С моей точки зрения, документация выглядит простой, но удобной.Их code snippets должен быстро запускать вас. Кривая обучения практически не существует, что должно помочь уменьшить недостаток документации. FYI, ядро ​​Java TreeMap основано на дереве красно-черных.

Scala - Это выбор, который я бы сделал, если бы был на твоей обуви. Кажется, вы не хотите изучать новый язык, но Scala - очень простой переход от Java. Сначала вы можете написать очень похожий на Java код и медленно принять более функциональные идиомы. Java < -> Scala interop отлично работает в обоих направлениях.

Clojure - Насколько я люблю Clojure, его трудно рекомендовать в данном конкретном случае из-за радикально различного синтаксиса и крутой кривой обучения для Java-разработчика.

+0

спасибо. Дело не в том, что я не доволен ни одним из них, просто я незнаком с ними, и, к сожалению, у меня мало времени для принятия обоснованного решения самостоятельно (отсюда и этот вопрос). В общем, я не против изучать новый язык, но это накладывает ограничения на тех, кто поддерживает/просматривает мой код. Думаю, я тоже склоняюсь к Скале; У меня есть «Программирование в Scala» на моей полке, так что я никогда не могу заставить синтаксис правильно использовать его. –

+0

@ Джейсон С: Я думаю, что инвестиции в Scala будут стоить усилий. Это отличный язык. – dbyrne

0

Я провел некоторое время, делая Clojure настойчивые/неизменные данные-структуры работают в Java, с разумными строителями и воспроизведенными в рамках Pure4J.

Этот класс также включает в себя класс @ImmutableValue, который гарантирует, что коллекции не только неизменяемы, но и ценности, которые вы в них вносите, неизменяемы.

Надеюсь, это поможет.

Смежные вопросы