Подтвердить что ты не робот

Java: библиотеки для неизменяемых структур данных функционального стиля

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

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

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

но я не уверен, что это особенно привлекательно для меня. У меня есть несколько требований/желаний:

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 3

Scala

Вы можете вызвать методы любого языка из методов в другом

http://www.scala-lang.org/faq/4

Ответ 4

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

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

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