Сравнение фреймворка Google guava и Scala. - PullRequest
31 голосов
/ 06 июля 2011

Существует много общих понятий:

  • неизменяемая коллекция,
  • представление коллекции,
  • строгая / не строгая коллекция,
  • сборщики коллекций

одинаковые шаблоны в Guava и Scala Collection API.Так в чем же разница?Совместимы ли обе библиотеки с шаблонами?Является ли простота расширения хорошей?

Так что я хотел бы услышать сравнение этих структур от кого-то, кто использует их оба.

Ответы [ 4 ]

26 голосов
/ 06 июля 2011

Google Guava - фантастическая библиотека, в этом нет никаких сомнений. Тем не менее, он реализован в Java и страдает от всех ограничений, которые это подразумевает:

  • Нет интерфейса неизменяемой коллекции в стандартной библиотеке
  • Нет лямбда-литералов (замыканий), так что есть некоторые тяжелые шаблоны вокруг типов SAM, необходимых для, например, предикаты
  • много дублирования в спецификациях типов, особенно когда используются дженерики

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

Коллекции Scala имеют дизайн, который намного лучше интегрирован в язык, вы найдете их широко используемыми во всей стандартной библиотеке scala и в сторонних продуктах, реализованных в Scala. Коллекции Scala также являются неизменяемыми по умолчанию, поэтому вы получите гораздо более безопасный код, который не требует дополнительного слоя защитной упаковки.

Если вы можете использовать Scala, тогда сделайте это, у него есть много преимуществ, помимо рамок коллекций. Если вам нужно использовать Java, тогда Guava - хороший выбор, особенно учитывая, что коллекции Scala не особенно просты в использовании без языковых функций, которые предоставляет Scala.

В смешанном проекте коллекции Guava могут быть префектно использованы из Scala, но язык также предоставляет механизмы, позволяющие вам использовать коллекции Java (включая Guava, которые предоставляют те же интерфейсы), как если бы они были собственными коллекциями Scala.

7 голосов
/ 06 июля 2011

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

Однако написание замыканий в java означает непосредственное определение множества анонимных классов, которые многословны и скучны.

Коллекции Scala по-прежнему превосходятсрок проектирования (с каскадом частичных реализаций из-за особенностей) и функциональности.Создать собственную коллекцию и получить все преимущества коллекций scala легко, просто внедрив небольшой набор методов.

4 голосов
/ 07 июля 2011

Другие уже ответили на ваш вопрос, но я думаю, что вы упустили интересную альтернативу, Функциональную библиотеку Java .Он игнорирует API Java Collection и предоставляет неизменные коллекции, которые выглядят и ведут себя как упрощенные коллекции Scala.

3 голосов
/ 06 июля 2011

Я использовал Scala, коллекции Google и F #. В последнее время я использую итераторы коллекций Google и забываю о силе выражений последовательности F #. Кажется, что Scala предпочитает не строгие (ленивые) списки, а итераторы / последовательности.

В коллекциях F # и Google (см. Google Iterators) вы можете преобразовать и отфильтровать итераторы, создавая хороший push-конвейер работы, представленный в виде потока объектов. Это не значит, что вы не можете делать это в Scala, просто это не распространено. В F # есть классный трубочный оператор для фильтрации итераторов (последовательностей).

Например, я ожидал бы, что выражение yield Scala сгенерирует итератор, такой как Python (или блоки последовательности F #), вместо этого он возвращает список.

Оба очень похожи, и у Scala есть огромные преимущества с точки зрения скорости и синтаксиса, но при их использовании я чувствую (мое мнение):

  • Коллекции Google ориентированы на карту и итератор.
  • Scala очень сфокусирован на List.

ПРИМЕЧАНИЕ. Похоже, что Scala 2.8 внесла значительные изменения в свои коллекции (я использовал более старую версию Scala).

...