Pourquoi utiliser Scala sur Java


16

Je suis totalement dans Scala en tant que langage ... et je continue de me demander pourquoi une entreprise devrait passer de Java à Scala. Scala est-il juste du sucre syntaxique sur la JVM ou y a-t-il des améliorations fondamentales dans Scala sur Java qui amélioreraient les applications du monde réel?


4
Cela a obtenu d'avoir un endroit en double.

2
Il semble que vous l'ayez beaucoup utilisé (Scala) (enfin, plus que moi) - qu'avez- vous trouvé dans vos expériences personnelles?
FrustratedWithFormsDesigner

J'ai vu des questions comme ... Que pensent les développeurs Java de Scala, Que dois-je faire ensuite en tant que développeur Java, Comment lancer ma migration de Java vers Scala ... mais où n'ai-je pas vu une question ou une réponse qui se concentre sur les raisons motivant l'utilisation de Scala comme langage de programmation pour le développement du monde réel.
Dakotah North

1
@delnan, au moins sur SO: stackoverflow.com/questions/6073517/… . @DakotahNorth, veuillez ne pas croiser les messages entre les sites SE - choisissez le forum le mieux adapté à votre question et postez-y uniquement. Sur d'autres sites, votre message sera de toute façon fermé, tout comme cela s'est produit avec celui-ci sur SO.
Péter Török

1
Voici un autre duplicata presque exact sur SO, avec d'excellentes réponses: stackoverflow.com/questions/2683914/…
Péter Török

Réponses:


19

Avertissement: je ne suis pas un gourou de Scala.

Scala fait extrêmement bien deux choses que Java (actuellement) ne fait pas.

Résoudre les problèmes fonctionnels

  • Au niveau le plus élémentaire, Scala a des fermetures à part entière avec le support des collections. Cela signifie que vous n'avez plus à écrire le code de plaque de chaudière tel que (arraché sans vergogne un poste DZone)

    public List<Item> bought(User user)
    {
        List<Item> result = new ArrayList();
        for (Item item : currentItems)
        {
            if (user.bought(item))
            {
                result.add(item);
            }
        }
        return result;
    }

Mais écrivez plutôt quelque chose comme:

def bought(user: User) = items.filter(user bought _)
  • Il y a plus d'amour fonctionnel, mais je ne suis pas qualifié pour en parler car je suis toujours en train de sucer la programmation fonctionnelle :)

Résolvez la concurrence d'une manière plus sûre

  • Scala a un modèle d'acteurs (+ une autre bonté) qui est intrinsèquement plus sûr que les données mutables de Java + verrouille le modèle Thread (peu importe la qualité des bibliothèques, Java est toujours gêné par le langage).

Je ne peux honnêtement pas penser à autre chose qui fait que Scala se tient la tête et les épaules au-dessus de Java. Beaucoup de petits gains et améliorations oui, mais aussi beaucoup plus de corde pour vous accrocher. YMMV

HTH un peu


3
Je voudrais souligner que akka (modèle d'acteur) est disponible pour Scala et Java. Voir akka.io
Giorgio

5
J'aime Scala et j'y migre depuis Java. Cela me fait toujours chier quand Java et Scala sont comparés et que les développeurs de Scala essaient d'écrire du code Java aussi détaillé et multi-lignes que possible et essaient très fort de le remplacer par Scala one liner. Sans perte de lisibilité au-dessus du code Java pourrait tenir sur 5 lignes, pas 12
mat

2
"Beaucoup de petits gains et améliorations oui, mais aussi beaucoup plus de corde pour vous accrocher." +1
Rob

@lucek D'autant plus que l'extrait utilise la convention des accolades de C au lieu de Java: P
Andres F.

@robjb: "Beaucoup de petits gains et améliorations oui, mais aussi beaucoup plus de corde pour vous accrocher." Je ne suis pas d'accord que Scala vous donne plus de corde pour vous accrocher. Au moins, il n'y a aucune explication à cette affirmation dans la réponse et je ne peux pas en voir une moi-même. De plus, Scala n'introduit pas seulement quelques idiomes fonctionnels au-dessus d'un langage OO (comme par exemple C # et Java 8), il essaie d'intégrer OOP et FP dans un paradigme. À mon humble avis, il ne s'agit pas de "petites améliorations" mais plutôt d'un changement de paradigme.
Giorgio

9

Cela dépend de votre définition de "sucre syntaxique". Par exemple, en quoi Java est-il plus qu'un simple sucre syntaxique sur du code machine?

N'importe quelle langue peut faire moins que le code machine, mais aucune langue ne peut faire plus.

Ce que les langages de haut niveau apportent à la table rend le code plus facile à lire et à comprendre, plus facile à composer et à attraper plus d'erreurs. Et, à mon avis, c'est le premier de ceux-ci qui fait le plus de différence - précisément "juste du sucre syntaxique".

Mais en considérant seulement les deux autres, il y a toujours des avantages de Scala par rapport à Java.

Ne pas insister sur le fait, mais avoir des fermetures rend le code beaucoup plus composable que de ne pas avoir de fermetures. Et bien que Java 7 ajoute quelque chose appelé des fermetures, ce ne sera pas le cas - ce ne seront que des fonctions anonymes.

Quant à la détection de plus d'erreurs, la gestion supérieure de la variance de Scala en est la preuve suffisante. De plus, l'accent mis sur l'immuabilité empêche également toutes sortes d'erreurs - ce n'est pas que Java ne peut pas faire immuable, mais il ne vient tout simplement pas avec la bibliothèque pour le faire.


4
En fait, les «fermetures» de Java n'arriveront pas avant Java 8
Martijn Verburg

1
@Martijn Merci pour la correction. À ce stade, je ne m'en soucie plus vraiment.
Daniel C.Sobral

1
Je dirais que le sucre syntaxique n'est qu'une syntaxe alternative en plus de la sémantique existante. Puisque la sémantique du code machine n'inclut pas les objets, les classes, etc., je pense que Java n'est pas seulement du sucre syntaxique sur le code machine. Le paradigme de la sémantique et de la programmation est différent.
Giorgio

@Martijn Verburg: Java a déjà une forme de fermetures (sous la forme de classes internes anonymes). Ce qui lui manque, ce sont des fonctions anonymes (qui peuvent être considérées comme des classes anonymes spéciales avec exactement une méthode et une syntaxe spéciale).
Giorgio

@Giorgio - vrai, mais la classe interne anon est peu performante par rapport à la prochaine implémentation basée sur la dynamique invoquée et c'est bien, le code source est laid IMO :-)
Martijn Verburg

2

En plus de la réponse de Martijn, je voudrais ajouter que Scala est plus expressif que Java et les avantages sont que (1) il vous rend plus productif (2) écrire moins de code pour résoudre le même problème signifie que vous pouvez réduire les bogues dans votre code (le code sans bogue IMHO est un mythe).


0

J'utilise Scala depuis environ 3 mois maintenant et je ne trouve toujours rien que je ne pourrais pas faire en Java. Pour moi, littéralement, chaque littérature sur Scala semble mentionner la même chose passe- partout . Si ce que vous cherchez est de réduire le passe- partout, Scala est pour vous, mais à mon humble avis, par exemple, l'exemple de filtre donné ci-dessus pourrait tout aussi bien être résolu en utilisant des collections apache.

<T> CollectionUtils.filter(Predicate<T>...)

ou utiliser des fermetures comme ça

<T> CollectionUtils.forAllDo(..., Closure<T>)

Mais bien sûr, plus verbeux. J'aime bien l'inférence de type. En apprenant Scala, vous vous rendrez compte que c'est probablement ce qui se passe de toute façon sous le capot. À mon avis, chaque langue est accompagnée de + ve et -ve.


-3

liste de compréhension, pour la compréhension.

par exemple en java vous écrivez:

int myVar;
if (condition) {
  myVar = //some value
}
else {
 myVar = //some other value
}

En scala, le même code est écrit de façon beaucoup plus élégante (comme python) que:

int myVar = (//some value) if (condition) else // other value;

Et.. Voila.

Scala offre tellement de choses que Java ne propose pas. Il n'y a tout simplement aucune comparaison. Le seul problème est que les gens sont plus familiers avec Java (b / c c'est ce qu'ils enseignent dans les classes CS) et pas aussi compétents avec le paradigme Scala.

Scala a une récursivité de queue, il peut retourner des tuples (quelque chose qui pourrait arriver dans Java 8 je pense).

Ce n'est pas une comparaison. Scala a été développé par Martin Ordersky, qui a travaillé sur l'équipe principale de Java Generics.

Scala est juste une langue bien supérieure. C'est tout ce qu'on peut en dire. Les gens qui disent le contraire n'ont tout simplement pas suffisamment exploré Scala pour en savoir plus.

Ci-dessus, je voulais dire l'optimisation de la récursivité de la queue (ce que la JVM ne peut pas faire comme le compilateur de Scala peut).

Scala compile et s'exécute également plus rapidement que les applications JVM (Oui, c'est vrai). Sans parler des cadres. Nous utilisons Tomcat par exemple et déployons quelques servelets pour gérer REST.

Une chose que Tomcat ne peut pas faire, ce sont les opérations asynchrones qui nécessitent des E / S non bloquantes. Pour cela, les développeurs JAVA ont généralement inventé une solution de contournement à l'aide d'une file d'attente de messages (envoyez le message à la file d'attente, et un autre processus ou thread le récupère et fait ce que vous voulez en arrière-plan).

Malheureusement, cette méthode est cr * p, et un hack sur les limitations du déploiement des servlets Java sur Tomcat.

Allez voir akka + spray. Il utilise les acteurs de scala (les acteurs sont comme les threads, sauf que la seule façon de communiquer est par le biais de messages).

Et maintenant, les appels REST asynchrones sont faciles. Tâche d'arrière-plan de longue durée? Aucun problème. Il suffit de tirer et d'oublier, et de faire des sondages REST pour vérifier son état depuis le front-end de temps en temps.

Si vous utilisez toujours Java et pensez que c'est mieux que scala, vous pourriez tout aussi bien cesser d'utiliser votre ordinateur pour taper et revenir à l'époque des plumes d'oie et de l'écriture aux chandelles. Java est fondamentalement antédiluvien par rapport à Scala.


4
Ce n'est pas un exemple de compréhension de liste. Et en Java vous écrivez:int myVar = condition ? someValue : otherValue
kevin cline

1
Vous devez modifier ces //some value //other valuecommentaires pour en faire des commentaires /*some value*/ou quelque chose. Il perturbe actuellement votre mise en évidence de la syntaxe: p
KChaloux
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.