Java: библиотеки для неизменяемых структур данных функционального стиля
Это очень похоже на другой вопрос (Структуры функциональных данных в Java), но ответы там не особенно полезны.
Мне нужно использовать неизменные версии стандартных наборов Java (например, HashMap/TreeMap/ArrayList/LinkedList/HashSet/TreeSet). Под "неизменяемым" я подразумеваю неизменяемость в функциональном смысле (например, чисто функциональные структуры данных), где операции обновления в структуре данных не изменяют исходные данные, но вместо этого верните новый экземпляр того же типа структуры данных. Также типично новые и старые экземпляры структуры данных будут совместно использовать неизменяемые данные, чтобы быть эффективными во времени и пространстве.
Из того, что я могу сказать, мои варианты включают:
но я не уверен, что это особенно привлекательно для меня. У меня есть несколько требований/желаний:
-
рассматриваемые коллекции должны использоваться непосредственно в Java (с соответствующими библиотеками в пути к классам). FJ будет работать для меня; Я не уверен, могу ли я использовать структуры данных Scala или Clojure в Java без использования компиляторов/интерпретаторов с этих языков и без необходимости писать код Scala или Clojure.
-
Основные операции над списками/картами/наборами должны быть возможны без необходимости создавать функциональные объекты с запутанными синтаксисами (FJ выглядит слегка iffy)
-
Они должны быть эффективными во времени и пространстве. Я ищу библиотеку, которая идеально провела тестирование производительности. FJ TreeMap основан на красно-черном дереве, не уверен, как это оценивается.
-
Документация/учебники должны быть достаточно хорошими, чтобы кто-то мог быстро начать работу с структурами данных. FJ не работает на этом фронте.
Любые предложения?
Ответы
Ответ 1
Мне кажется, вы уже знаете, каковы ваши варианты, вы просто не довольны ни одним из них. Вот мой выбор на три варианта, которые вы предоставили:
Функциональная Java. Это похоже на то, что вам лучше всего подходит. Он соответствует всем вашим требованиям, за исключением того, что вам не нравится документация. С моей точки зрения, документация выглядит простой, но удобной. Их фрагменты кода должны быстро запускать вас. Кривая обучения практически не существует, что должно помочь уменьшить недостаток документации. FYI, ядро Java TreeMap основано также на красно-черном дереве.
Scala. Это тот выбор, который я бы сделал, если бы был на твоем месте. Кажется, вы не хотите изучать новый язык, но Scala - очень простой переход от Java. Сначала вы можете написать очень похожий на Java код и медленно принять более функциональные идиомы. Взаимодействие Java ↔ Scala отлично работает в обоих направлениях.
Clojure. Насколько мне нравится Clojure, его трудно рекомендовать в этом конкретном случае из-за радикально различного синтаксиса и крутой кривой обучения для Java-разработчика.
Ответ 2
Возможно, Google guava-библиотеки могут быть полезны:
https://code.google.com/p/guava-libraries/wiki/ImmutableCollectionsExplained
Ответ 3
Scala
Вы можете вызвать методы любого языка из методов в другом
http://www.scala-lang.org/faq/4
Ответ 4
Я потратил некоторое время на создание устойчивых/неизменных структур данных Clojure на Java, с разумными конструкторами и дженериками как часть Pure4J.
Это также включает класс @ImmutableValue
для обеспечения того, что коллекции не только неизменяемы, но и значения, которые вы им вставляете, тоже неизменяемы.
Надеюсь, что это поможет.