J'ai besoin de quelques exemples de code (et je suis aussi très curieux à leur sujet) de code Scala et Java qui montrent que le code Scala est plus simple et concis que le code écrit en Java (bien sûr, les deux exemples devraient résoudre le même problème).
S'il n'y a qu'un exemple Scala avec un commentaire comme "c'est une fabrique abstraite dans Scala, en Java cela aura l'air beaucoup plus encombrant" alors c'est également acceptable.
Merci!
J'aime plus que tout accepté et cela répond
Réponses:
Améliorons l'exemple de empileur et l' utilisation de Scala classes de cas :
La classe Scala ci-dessus contient toutes les fonctionnalités de la classe Java ci-dessous, et d'autres - par exemple, elle prend en charge la correspondance de modèles (ce que Java n'a pas). Scala 2.8 ajoute des arguments nommés et par défaut, qui sont utilisés pour générer une méthode de copie pour les classes de cas, ce qui donne la même capacité que les méthodes with * de la classe Java suivante.
Ensuite, dans l'utilisation, nous avons (bien sûr):
Contre
la source
productElements
etunapply
, pas dans le constructeur, le champ ou l'accesseur: gist.github.com/424375case class Person(val firstName: String, val lastName: String)
Et alors? Rendre cette chose privée serait également possible, mais n'a aucun sens, à cause de l'inapplication, etc.case class Person(private val firstName: String)
, mais vous ne devriez pas utiliser de classes de cas alors. Au lieu de cela, faitesclass Person(firstName: String)
etfirstName
est privé par défaut.val
etprivate val
est que les méthodes d' accès , c'estfirstName()
-à- dire etfirstName(String)
, sont publiques ou privées. Dans Scala, les champs sont toujours privés. Pour que Scala génère des méthodes get / set de style Java (en plus des accesseurs de style Scala), il y a l'@BeanProperty
annotation.J'ai trouvé celui-ci impressionnant
Java
Scala
En plus de ceux-ci (désolé de ne pas coller, je ne voulais pas voler le code)
la source
getFirstName
etgetLastName
méthodes. Vous devez annoter les paramètres avec unescala.reflect.BeanProperty
annotation pour ce faire.get
. Le code Java idiomatique est différent du code idiomatique Scala. Parfois, leis
préfixe utilisé pour les booléens. davetron5000.github.com/scala-style/naming_conventions/methods/…case class
et obtenir letoString
,equals
ethashCode
gratuitement (et vous n'avez pas non plus à faire valoirval
explicitement les arguments ):case class Person(firstName: String, lastName: String)
case class
, pas pour justeclass
.Tâche: rédiger un programme pour indexer une liste de mots-clés (comme des livres).
Explication:
Java:
Scala:
la source
Tâche:
Vous avez une liste
people
d'objets de classePerson
qui a des champsname
etage
. Votre tâche consiste à trier cette liste d'abord parname
, puis parage
.Java 7:
Scala:
Mettre à jour
Depuis que j'ai écrit cette réponse, il y a eu pas mal de progrès. Les lambdas (et les références de méthodes) ont enfin atterri à Java et prennent d'assaut le monde Java.
Voici à quoi ressemblera le code ci-dessus avec Java 8 (contribué par @fredoverflow):
Bien que ce code soit presque aussi court, il ne fonctionne pas aussi élégamment que celui de Scala.
Dans la solution Scala, la
Seq[A]#sortBy
méthode accepte une fonctionA => B
où ilB
est nécessaire d' avoir unOrdering
.Ordering
est une classe de type. Pensez au mieux aux deux mondes: commeComparable
, c'est implicite pour le type en question, mais commeComparator
, c'est extensible et peut être ajouté rétrospectivement aux types qui ne l'avaient pas. Comme Java manque de classes de types, il doit dupliquer chacune de ces méthodes, une fois pourComparable
, puis pourComparator
. Par exemple, voircomparing
etthenComparing
ici .Les classes de type permettent d'écrire des règles telles que "Si A a un ordre et B un ordre, alors leur tuple (A, B) a également un ordre". Dans le code, c'est-à-dire:
C'est ainsi que le
sortBy
dans notre code peut comparer par nom puis par âge. Cette sémantique sera encodée avec la "règle" ci-dessus. Un programmeur Scala s'attendrait intuitivement à ce que cela fonctionne de cette façon. Aucune méthode spéciale comme celle-cicomparing
n'a dû être ajoutéeOrdering
.Les lambdas et les références de méthodes ne sont que la pointe d'un iceberg qui est la programmation fonctionnelle. :)
la source
Tâche:
Vous avez un fichier XML "company.xml" qui ressemble à ceci:
Vous devez lire ce fichier et imprimer le
firstName
etlastName
champs de tous les employés.Java: [tiré d' ici ]
Scala: [prise d' ici , diapositive n ° 19]
[MODIFIER par Bill; Vérifiez les commentaires pour la discussion] -
Hmm, comment le faire sans répondre dans une section de réponse non formatée ... Hmph. Je suppose que je vais modifier votre réponse et vous laisser la supprimer si elle vous dérange.
Voici comment je le ferais en Java avec de meilleures bibliothèques:
Ceci est juste un hack rapide n'impliquant aucune magie et tous les composants réutilisables. Si je voulais ajouter de la magie, je pourrais faire quelque chose de mieux que de renvoyer un tableau de tableaux de chaînes, mais même tel quel, GoodXMLLib serait complètement réutilisable. Le premier paramètre de scanFor est la section, tous les futurs paramètres seraient les éléments à trouver qui sont limités, mais l'interface pourrait être légèrement polie pour ajouter plusieurs niveaux de correspondance sans réel problème.
J'admets que Java a un support de bibliothèque assez médiocre en général, mais allez - comparer une utilisation horrible de la bibliothèque XML vieille de dix ans (?) De Java à une implémentation basée sur le fait d'être laconique n'est tout simplement pas juste - et c'est loin à partir d'une comparaison des langues!
la source
Une carte des actions à effectuer en fonction d'une chaîne.
Java 7:
Scala:
Et tout est fait dans le meilleur goût possible!
Java 8:
la source
todos.get("hi")
renvoieOption[()=>Unit]
ce qui est nécessaire pour correspondre correctement.val defaultFun = {() => println("task not found")}; todos.getOrElse("hi", defaultFun).apply()
val todos = Map("hi" -> { () => println("Good morning!") }) withDefaultValue { () => println("task not found") }
et puistodos("hi")()
J'écris un jeu de Blackjack à Scala maintenant. Voici à quoi ressemblerait ma méthode dealerWins en Java:
Voici à quoi cela ressemble dans Scala:
Hourra pour les fonctions d'ordre supérieur!
Solution Java 8:
la source
def dealerWins = !(players exists (_ beats dealer))
J'ai aimé cet exemple simple de tri et de transformation, tiré du livre 'Beginning Scala' de David Pollak:
Dans Scala:
En Java:
la source
Et Quicksort?
Java
Ce qui suit est un exemple java trouvé via une recherche Google,
l'URL est http://www.mycstutorials.com/articles/sorting/quicksort
Scala
Une tentative rapide d'une version Scala. Saison ouverte pour les améliorateurs de code; @)
la source
partition
pour éviter cela.J'ai tellement aimé la réponse de l' utilisateur inconnu que je vais essayer de l'améliorer. Le code ci-dessous n'est pas une traduction directe de l'exemple Java, mais il accomplit la même tâche avec la même API.
la source
J'aime beaucoup la méthode getOrElseUpdate, trouvée dans mutableMap et montrée ici, d'abord Java, sans:
oui - un WordCount, et ici dans scala:
Et le voici en Java 8:
Et si vous voulez être 100% fonctionnel:
filter
etsort
ont déjà été montrés, mais regardez comme ils sont faciles à intégrer à la carte:la source
Ceci est un exemple très simple: des entiers carrés, puis ajoutez-les
Dans scala:
La carte compacte applique la fonction à tous les éléments du tableau, donc:
Le pli à gauche commencera par 0 comme accumulateur (s) et s'appliquera
add(s,i)
à tous les éléments (i) du tableau, de sorte que:Maintenant, cela peut être encore compacté pour:
Celui-ci je n'essaierai pas en Java (trop de travail), transformez XML en Map:
Une autre ligne pour obtenir la carte à partir du XML:
la source
sumSquare
Scala est qu'il semble très cryptique pour un développeur Java, ce qui leur donnera des munitions contre vous pour se plaindre que Scala est obscur et compliqué ...Problème: vous devez concevoir une méthode qui exécutera n'importe quel code donné de manière asynchrone.
Solution en Java :
La même chose dans Scala (en utilisant des acteurs):
la source
Le modèle de disjoncteur de Michael Nygard's Release It in FaKods ( lien vers le code )
l'implémentation ressemble à ceci dans Scala:
Ce que je trouve super sympa. Cela ressemble à une partie du langage, mais c'est un simple mixin dans l' objet CircuitBreaker qui fait tout le travail.
Référence dans d'autres langues Google pour "Disjoncteur" + votre langue.
la source
Je prépare un document qui donne plusieurs exemples de code Java et Scala, en utilisant uniquement les fonctionnalités simples à comprendre de Scala:
Scala: un meilleur Java
Si vous souhaitez que j'y ajoute quelque chose, veuillez répondre dans les commentaires.
la source
Pourquoi personne n'a publié ça avant:
Java:
116 caractères.
Scala:
56 caractères.
la source
Application
trait considéré comme nocif ... scala-blogs.org/2008/07/…Les flux infinis évalués paresseusement en sont un bon exemple:
Voici une question concernant les flux infinis en Java: Un itérateur infini est-il mal conçu?
Les fonctions et fermetures de première classe sont un autre bon exemple:
Java ne prend pas en charge les fonctions de première classe et imiter les fermetures avec des classes internes anonymes n'est pas très élégant. Une autre chose que cet exemple montre que java ne peut pas faire est d'exécuter du code à partir d'un interpréteur / REPL. Je trouve cela extrêmement utile pour tester rapidement des extraits de code.
la source
Iterable
etIterator
produire des flux infinis.Ce code Scala ...
... serait complètement illisible en Java, si possible du tout.
la source