Структуры функциональных данных в Java

Имеет ли стандартная библиотека Java какие-либо функциональные структуры данных, такие как неизменяемые наборы, списки и т.д. с функциональным обновлением?

Ответ 2

Посмотрите на проект pcollections:

PCollections служит постоянным и неизменным аналогом Framework Java Collections. Это включает эффективные, потокобезопасные, общие, неизменные и постоянные стеки, карты, векторы, наборы и пакеты, совместимые со своими коллегами Java Collections.

Постоянный и неизменный тип данных все чаще оценивается как простая, дружественная к дизайну, concurrency дружественная, а иногда и более эффективная по времени и пространству альтернатива изменяемым типам данных.

Ответ 3

Похоже, вы ищете Scala. Он компилируется в .class, так что достаточно хорошо, правильно?

Ответ 4

Вам не нужно scala. Просто передайте свою коллекцию в:

java.util.Collections.unmodifiableCollection(/* Collection<? extends T> c */);
java.util.Collections.unmodifiableSet(Set s);
java.util.Collections.unmodifiableMap(Map m);
java.util.Collections.unmodifiableList(List l);

Я только что увидел это из другого вопроса:

Google ImmutableSet

http://google-collections.googlecode.com/svn/trunk/javadoc/com/google/common/collect/ImmutableSet.html

из документов:

В отличие от Collections.unmodifiableSet(java.util.Set), который представляет собой отдельный которые все еще могут измениться, экземпляр этого класса содержит собственные личные данные и никогда не будут изменение. Этот класс удобен для публичные статические конечные множества ( "постоянная наборы" ), а также позволяет легко сделать "защитная копия" набора, предусмотренного для ваш класс вызывающим.

отредактирован для включения комментария.

Ответ 5

Ну, есть два возможных подхода к "изменению" неизменяемой коллекции:

  • Сделайте копию, которая включает в себя "изменение"

  • Создайте новый, другой объект, который состоит из ссылки на исходный объект и ссылки на описание изменения.

Clojure использует последний подход, поэтому становится довольно быстро создавать много братьев и сестер оригинальной коллекции с небольшими исправлениями для каждого с разумными требованиями к памяти. Но большинство Java-кода имеют тенденцию перейти к первому варианту.

Для чего это стоит, Google создал несколько коллекций, которые поддерживают программирование в функциональном стиле: http://code.google.com/p/google-collections/, но у меня нет посмотрел на них в глубину.

Ответ 6

Всегда приятно видеть коллекцию Google Collections, но нет, у нас этого нет. Я не знаю ни одной библиотеки Java, которая делает. Внутри Google мы реализовали некоторые функциональные структуры List, и угадайте, что? Никто их не использует. Поэтому они вряд ли скоро станут открытыми.

Ответ 7

Строки и числа неизменяемы функционально, но большинство коллекций не являются (неизменные коллекции вызывают исключения при добавлении, удалении и т.д.). CopyOnWriteArrayList и CopyOnWriteArraySet являются ближайшими В этом смысле.

Ответ 8

Если вы заинтересованы в манипуляциях с коллекциями в функциональном стиле, посмотрите lambdaj

Ответ 9

Я знаю, что это старый вопрос, но немного по поиску говорит мне, что теперь у нас есть альтернатива функциональной Java.

JavasLang выглядит как интересная библиотека для декларативного программирования и функциональных структур данных в Java.

Я не сравнивал его с Functional Java с точки зрения простоты использования и производительности, но мне бы хотелось получить какие-либо указатели на это.