Question Comparaison du cadre de collecte Google Guava vs Scala


Il y a beaucoup de concepts communs:

  • collection immuable,
  • vue de collection,
  • collection stricte / non stricte,
  • constructeurs de collection

mêmes modèles dans l'API Guava et Scala Collection. Alors, quelle est la difference? Les deux bibliothèques sont-elles compatibles avec les modèles? La facilité d'extension est-elle suffisante?

Donc, je voudrais entendre la comparaison de ces cadres de quelqu'un qui les utilise tous les deux.


29
2017-07-06 14:57


origine


Réponses:


Google Guava est une fantastique bibliothèque, cela ne fait aucun doute. Cependant, il est implémenté en Java et souffre de toutes les restrictions que cela implique:

  • Aucune interface de collection immuable dans la bibliothèque standard
  • Pas de littéraux lambda (fermetures), il y a donc une sorte de passe-partout lourd dans les types de SAM nécessaires, par exemple, pour prédicats
  • beaucoup de duplication dans les spécifications de type, en particulier lorsque des génériques sont impliqués

Guava doit également exister en présence de la bibliothèque de collections standard de Java. Il est donc rare que les bibliothèques tierces exposent des littéraux de fonctions compatibles avec les goyens ou utilisent des types de collections spécifiques à goyave. Cela provoque une incompatibilité d'impédance pour chaque bibliothèque tierce que vous utilisez. Par exemple, vous souhaiterez généralement convertir les collections retournées de ces bibliothèques vers la collection gava immutable appropriée, en particulier si vous travaillez dans un environnement multithread.

Les collections Scala ont une conception bien mieux intégrée au langage, vous les trouverez largement utilisées dans la bibliothèque standard Scala et dans les produits tiers implémentés dans Scala. Les collections Scala sont également immuables par défaut. Vous vous retrouvez donc avec un code beaucoup plus sûr qui ne nécessite pas de couche supplémentaire d'emballage défensif.

Si vous pouvez utiliser Scala, faites-le, cela présente de nombreux avantages au-delà du simple cadre des collections. Si vous devez utiliser Java, alors Guava est un bon choix, d'autant plus que les collections Scala ne sont pas particulièrement faciles à utiliser sans les fonctionnalités de langage fournies par Scala.

Dans un projet mixte, les collections Guava sont parfaitement utilisables depuis Scala, mais le langage fournit également des mécanismes vous permettant d'utiliser les collections Java (y compris celles de Guava, qui exposent les mêmes interfaces) comme si elles étaient les propres collections de Scala.


25
2017-07-06 17:10



J'utilise goyave dans tous mes projets java maintenant. Il donne une belle touche fonctionnelle aux collections java avec des motifs similaires.

Cependant, écrire des fermetures dans Java signifie définir directement beaucoup de classes anonymes, ce qui est verbeux et ennuyeux.

Les collections Scala sont toujours supérieures en termes de conception (avec la cascade d'implémentations partielles dues aux traits) et de fonctionnalités. Il est facile de créer votre propre collection et d’obtenir tous les avantages des collections Scala en n’implémentant qu’un petit ensemble de méthodes.


7
2017-07-06 15:18



Les autres ont déjà répondu à votre question, mais je pense que vous avez manqué une alternative intéressante, la Java fonctionnel Bibliothèque. Il ignore l'API de Java Collection et fournit des collections immuables qui ressemblent et se comportent comme des collections Scala simplifiées.


4
2017-07-06 21:10



J'ai utilisé Scala, les collections Google et F #. Dernièrement, j'ai utilisé les itérateurs des collections Google et je me moque de la puissance des expressions de séquence F #. Il semble que Scala préfère les listes non strictes (paresseuses) aux itérateurs / séquences.

Dans les collections F # et Google (voir Google Iterators), vous pouvez transformer et filtrer les itérateurs en créant un pipeline de travail poussé, représenté sous forme de flux d'objets. Ce n'est pas que vous ne pouvez pas faire cela dans Scala c'est juste pas commun. F # a un opérateur cool pour filtrer les itérateurs (séquences).

Par exemple, je m'attendrais à ce que l'expression de rendement de Scala génère un itérateur comme Python (ou les blocs de séquence F #) à la place, elle renvoie une liste.

Les deux sont très similaires et Scala a d'énormes avantages en termes de rapidité et de syntaxe, mais lorsque je les utilise (mon avis):

  • Les collections Google sont concentrées sur Map et Iterator.
  • Scala est très axée sur la liste.

NOTE il semble que Scala 2.8 a fait de grands changements dans ses collections (j'ai utilisé une ancienne version de Scala).


3
2017-07-06 15:50