Google guava vs Scala collection Framework porównanie

Istnieje wiele wspólnych pojęć:

  • zbiór niezmienny,
  • widok kolekcji,
  • zbiór strict/non strict,
  • Budowniczowie kolekcji

Te same wzorce w Guava i Scala Collection API. Więc jaka jest różnica? Czy obie biblioteki są zgodne z wzorcami? Czy łatwość rozbudowy jest dobra?

Więc chciałbym usłyszeć porównanie tych frameworków od kogoś, kto używa ich obu.

Author: yura, 2011-07-06

4 answers

Google Guava to fantastyczna biblioteka, nie ma co do tego wątpliwości. Jednak jest zaimplementowany w Javie i cierpi na wszystkie ograniczenia, które to implikuje:

  • Brak niezmiennego interfejsu kolekcji w bibliotece standardowej
  • Brak liter lambda (zamknięć), więc jest jakiś ciężki boilerplate wokół typów SAM potrzebnych do np. predykatów
  • wiele powielania w specyfikacjach typów, szczególnie w przypadku generycznych

Guawa też musi istnieć w obecność standardowej biblioteki kolekcji Javy, więc rzadko zdarza się, że biblioteki innych firm ujawniają literały funkcji kompatybilnych z guava lub wykorzystują typy kolekcji specyficzne dla guava. Powoduje to niedopasowanie impedancji dla każdej używanej biblioteki stron trzecich. Na przykład, zazwyczaj chcesz przekonwertować zwracane kolekcje z takich bibliotek do odpowiedniej niezmiennej kolekcji guava-zwłaszcza jeśli pracujesz w środowisku wielowątkowym.

Kolekcje Scala mają design to jest o wiele lepiej zintegrowane z językiem, znajdziesz je szeroko stosowane w całej bibliotece standardowej scala i za pośrednictwem produktów innych firm zaimplementowanych w Scala. Kolekcje Scali są również domyślnie niezmienne, więc otrzymujesz znacznie bezpieczniejszy kod, który nie wymaga dodatkowej warstwy ochronnego owijania.

Jeśli możesz używać Scali, to zrób to, ma ona wiele zalet poza tylko frameworkiem kolekcji. Jeśli musisz używać Javy, to Guava jest dobrym wyborem, zwłaszcza biorąc pod uwagę, że Kolekcje Scala nie są szczególnie łatwe w użyciu bez funkcji językowych, które oferuje Scala.

W projekcie mieszanym Kolekcje Guava są użyteczne z poziomu Scali, ale język zapewnia również mechanizmy pozwalające na używanie kolekcji Javy (w tym Guava, które ujawniają te same interfejsy) tak, jakby były własnymi kolekcjami Scali.

 26
Author: Kevin Wright,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-06 17:10:54

Używam guava we wszystkich moich projektach java teraz. Daje ładny funkcjonalny akcent kolekcjom Javy o podobnych wzorach.

Jednak pisanie zamknięć w Javie oznacza definiowanie wielu anonimowych klas bezpośrednio, które jest gadatliwe i nudne.

Kolekcje Scali są nadal lepsze pod względem projektowania (z kaskadą częściowych implementacji ze względu na cechy) i funkcjonalności. Łatwo jest stworzyć własną kolekcję i zyskać wszystkie zalety kolekcji scala poprzez implementacja małego zestawu metod.

 7
Author: paradigmatic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-06 15:18:26

Inni już odpowiedzieli na twoje pytanie, ale myślę, że przegapiłeś ciekawą alternatywę, bibliotekę Functional Java . Ignoruje API kolekcji Java i zapewnia niezmienne kolekcje, które wyglądają i zachowują się jak uproszczone Kolekcje Scala.

 4
Author: Landei,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-06 21:10:22

Używałem Scali, Google collections i F#. Ostatnio korzystam z iteratorów kolekcji Google i nie rozumiem potęgi wyrażeń sekwencyjnych F#. Wygląda na to, że Scala woli listy nieostre (leniwe) niż Iteratory/sekwencje.

W kolekcjach F# i Google (zobacz Iteratory google) można przekształcać i filtrować Iteratory tworząc ładny push pipeline pracy, który jest reprezentowany jako strumień obiektów. To nie tak, że nie możesz tego zrobić w Scali, to po prostu nie jest powszechne. F # ma fajną fajkę operator do filtrowania iteratorów (sekwencji).

Na przykład spodziewałbym się, że wyrażenie wydajności Scali wygeneruje iterator podobny do Pythona (lub F# sequence blocks) zamiast tego zwraca listę.

Oba są bardzo podobne i Scala ma ogromne zalety pod względem szybkości i składni, ale podczas korzystania z nich czuję (moja opinia):

  • Google collections skupia się na mapach i Iteratorach.
  • Scala jest bardzo skupiona na liście.

Uwaga wygląda na to, że Scala 2.8 zrobiła kilka duże zmiany w jej zbiorach (korzystałem ze starszej wersji Scali).

 3
Author: Adam Gent,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-06 16:03:54