2009-11-05 16 views
11

Czy biblioteka standardowa Java ma jakiekolwiek struktury danych funkcjonalnych, takie jak niezmienne zestawy, listy itp., Z aktualizacją funkcjonalną?Struktury danych funkcjonalnych w języku Java

+0

Chcesz głęboką kopię wszystkich obiektów na liście lub po prostu funkcję, która daje nową listę wskaźników wszystkich tych samych obiektów, co źródło? –

+0

Chcę, aby trwała struktura danych dla zestawu nie zostały zaimplementowane głupio. Na przykład lista niezmienna może zaimplementować dodawanie poprzez skopiowanie wszystkich elementów do nowej listy i dodanie elementu - O (n). Lub może to być połączona lista, dodać element do głowy i zwrócić głowę - O (1) – Claudiu

+0

nie ma ogólnego sposobu na "deep-copy" niczego w Javie. –

Odpowiedz

1

Wygląda na to, że szukasz Scala. Kompiluje się do .class, więc to wystarczy, prawda?

+0

hmm być może. Chodzi o to, że otrzymaliśmy kod pomocniczy w kursie, który działa funkcjonalnie (tj. Dodanie czegoś do struktury zwraca nową wersję z aktualizacją), ale jest napisany przez zwykłe kopiowanie starej struktury i dodawanie do niej czegoś nowego. to sprawia, że ​​jestem smutny. Zastanawiałem się, czy był łatwy, lepszy sposób, ale myślę, że Java po prostu utrudnia. – Claudiu

1

Nie potrzebujesz scala. Wystarczy przekazać swoją kolekcję na:

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); 

Właśnie widziałem to z innego SO pytanie:

Google ImmutableSet

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

od docs:

przeciwieństwie Kolekcje .unmodifiableSet (java.util.Set), , który jest widokiem oddzielnej kolekcji , która wciąż może się zmienić, instancja tej klasy zawiera własne prywatne dane i nigdy nie zmieni się . Ta klasa jest wygodna dla publicznych, publicznych zestawów końcowych ("stałych zestawów "), a także pozwala łatwo wykonać "obronną kopię" zestawu dostarczonego do użytkownika przez osobę dzwoniącą.

edytowane tak, aby zawierało komentarz.

+0

+1: Byłeś bardziej nieprzyjemny =) Są przy okazji także 'unmodifiableList()', 'unmodifiableMap()', oraz więcej metod dostępnych w 'java.util.Collections' API: http://java.sun.com /javase/6/docs/api/java/util/Collections.html – BalusC

+0

Chcę dodać coś do zestawu, zachowując stary zestaw taki sam i zwracając nowy zestaw. Nie sądzę, że nie da się tego zmodyfikowad. – Claudiu

+0

@ Claudiu tak, niemodyfikowalne. Z pewnością tego nie zrobię. –

1

Cóż, istnieją dwa możliwe podejścia do „zmiana” jest niezmienny kolekcję:

  • Zrób kopię, która obejmuje „zmiana”

  • Utwórz nowy, inny obiekt, który składa odniesienia do oryginalnego obiektu i odniesienie do opisu zmiany.

Clojure zajmuje drugie podejście, dzięki czemu staje się dość szybko stworzyć wiele rodzeństwa oryginalnej kolekcji z niewielkimi korektami do siebie, z rozsądnych wymagań pamięciowych. Ale większość kodu Java ma tendencję do wybierania pierwszej opcji.

Za to, co jest warte, Google stworzył garść kolekcji obsługujących programowanie w stylu funkcjonalnym: http://code.google.com/p/google-collections/, ale nie przyjrzałem się im dokładniej.

0

Łańcuchy i liczby są niezmienne w funkcjonalny sposób, ale większość kolekcji nie jest (niezmienne kolekcje wyrzucają wyjątki przy dodawaniu, usuwaniu itp.). CopyOnWriteArrayList i CopyOnWriteArraySet są najbliższe w tym sensie.

1

Zawsze dobrze jest widzieć kolekcje Google podłączone, ale nie, nie mamy tego. Nie znam żadnej biblioteki Java, która to robi. W Google zaimplementowaliśmy kilka funkcjonalnych struktur listowych i zgadnij co? Nikt ich nie używa.Dlatego w najbliższym czasie nie będą one prawdopodobnie otwarte.

0

Jeśli jesteś zainteresowany w kolekcjach manipulacja w stylu funkcjonalnym dać wygląd lambdaj

2

Zapraszamy do obejrzenia projektu pcollections:

PCollections służy jako trwałe i niezmienne analogu zbiorach Java Struktura. Obejmuje to wydajne, bezpieczne dla wątków, ogólne, niezmienne i trwałe stosy, mapy, wektory, zestawy i torby, zgodne z odpowiednikami w kolekcjach Java.

Utrwalone i niezmienne typy danych są coraz częściej wybierane jako prosta, przyjazna dla projektu, przyjazna dla współbieżności i czasem bardziej czaso- i przestrzenna alternatywa dla zmiennych typów danych.

0

Wiem, że to stare pytanie, ale odrobina poszukiwań mówi mi, że teraz mamy alternatywę dla funkcjonalnej Java.

wygląda interesującą bibliotekę dla programowania deklaratywnego i struktur danych funkcjonalnych w Javie.

Nie porównałem go z funkcjonalną Javą pod względem łatwości użytkowania i wydajności, ale chciałbym uzyskać jakiekolwiek wskazówki na ten temat.