Je veux que vous utilisiez Scala comme meilleur Java pour le moment

introduction

Cela fait environ deux ans que j'ai commencé à utiliser Scala. J'adore Scala, donc je le recommande aux ingénieurs autour de moi, mais il semble qu'il y ait un sentiment répulsif tel que "Langage fonctionnel? Cela semble difficile et Java n'est pas bon?" Bien sûr, il est difficile d'utiliser toutes les fonctionnalités de Scala, mais si vous voulez juste connaître les qualités de Scala, vous n'avez pas besoin de comprendre «fonctionnel» depuis le début. Voici quelques-unes des fonctionnalités de Scala que je trouve intéressantes pour les ingénieurs Java.

Exploitez les ressources Java

Scala a un gestionnaire de paquets appelé sbt qui peut également être utilisé avec n'importe quelle bibliothèque distribuée par Maven. Vous pouvez également faire coexister Scala et Java dans le code source de votre projet. En d'autres termes, vous n'avez pas à remplacer le code source en une seule fois et vous pouvez dire: "Essayons uniquement les nouvelles fonctionnalités que nous allons créer avec Scala."

case class

Créez une classe «Coin» (pièce) avec «prix» (montant) et «unité» (unité). Pour des pièces de 100 yens, utilisez-le comme new Coin (100.0," Yen "). Si vous utilisez la classe de cas, vous pouvez écrire comme suit.

Coin.scala


case class Coin(price: Double, unit: String)

Le code équivalent en Java est le suivant. (Pour être exact, il remplace hashCode, toString, copy, etc., mais ce sera trop long, donc je vais l'omettre.)

JavaCoin.java


public class JavaCoin {

    public final double price;
    public final String unit;

    public JavaCoin(double price, String unit) {
        this.price = price;
        this.unit = unit;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj instanceof JavaCoin) {
            JavaCoin another = (JavaCoin) obj;
            return this.price == another.price && this.unit.equals(another.unit);
        }
        return false;
    }

}

C'est extrêmement court. Je pense que la brièveté est justice.

La plupart des éléments sont des expressions

Les éléments qui composent un programme sont des ** expressions ** et des ** instructions **. Par définition, celui qui renvoie la valeur est une expression et tout le reste est une déclaration. En Java, ʻif, for, switch`, etc. sont des instructions, mais dans Scala, ce sont toutes des expressions. Un exemple concret sera expliqué plus loin.

switch est puissant

Ajoutez la méthode suivante à la classe Coin. Une méthode qui aligne ʻunitavecDollar`.

Coin.scala


  def toDollar: Coin =
    this match {
      case Coin(_, "Dollar") => this
      case Coin(_price, "Cent") => Coin(_price * 0.01, "Dollar")
      case Coin(_price, "Yen") => Coin(_price * 0.088, "Dollar")
    }

match est switch dans Scala. Comme mentionné ci-dessus, avec case class, vous pouvez faire correspondre les propriétés et les lier à des variables. (En fait, vous devriez utiliser le polymorphisme, mais je ne l'utiliserai pas cette fois car ce sera compliqué) De plus, je n'ai pas écrit return, mais dans Scala le résultat de l'expression est la valeur de retour sans rien écrire. Dans Scala, match est une expression, donc c'est une valeur de retour.

Remplacement de l'opérateur

Ajoutez la méthode suivante à la classe Coin. Une méthode qui ajoute deux Coins.

Coin.scala


  def +(another: Coin): Coin =
    if (this.unit == another.unit)
      Coin(this.price + another.price, this.unit)
    else
      this.toDollar + another.toDollar

Si ʻunitest la même, elle est ajoutée telle quelle, et si elle est différente, elle est ajoutée en ligne avec" Dollar "`. Il peut être utilisé comme opérateur comme suit.

  println(
    Coin(1, "Dollar")
      + Coin(10, "Cent")
      + Coin(25, "Cent")
      + Coin(100, "Yen")
      + Coin(500, "Yen")
  )
  // Coin(54.15,Dollar)

N'a pas d'état (ne réaffecte pas)

Comme vous l'avez peut-être remarqué en lisant jusqu'ici, Scala ne ** réaffecte pas **. C'est la même chose que la déclaration Java «finale». Vous pourriez demander: "Pourquoi n'utilisez-vous pas final en Java?", Mais il est important de noter que la plupart des spécifications de langage, bibliothèques standard et bibliothèques tierces de Scala suivent cette règle. Ne pas réaffecter peut être reformulé comme n'ayant aucun état. S'il n'y a pas d'état, la valeur de retour de la fonction sera déterminée uniquement par l'argument, ce qui simplifie la réflexion. Il existe de nombreux avantages, tels que le fait de ne pas avoir à regarder la valeur de chaque variable dans le débogueur ou à écrire un scénario de test qui suppose l'état. C'est une explication détournée, mais vous devriez être en mesure de réaliser la force de cette règle en l'utilisant. (En fait, cet élément met un pied dans le concept de type fonctionnel, mais je l'ai expliqué parce que je pense que c'est le plus important.)

en conclusion

Cela fait longtemps, mais merci d'avoir lu. Il y a encore beaucoup d'endroits que je voudrais vous présenter, mais comme il n'y a pas de fin, je vais terminer ici. De plus en plus d'entreprises adoptent Scala ces jours-ci, et j'espère que cet article vous aidera.

Code source complet

Coin.scala


case class Coin(price: Double, unit: String) {

  def toDollar: Coin =
    this match {
      case Coin(_, "Dollar") => this
      case Coin(_price, "Cent") => Coin(_price * 0.01, "Dollar")
      case Coin(_price, "Yen") => Coin(_price * 0.088, "Dollar")
    }

  def +(another: Coin): Coin =
    if (this.unit == another.unit)
      Coin(this.price + another.price, this.unit)
    else
      this.toDollar + another.toDollar

}

object Coin extends App {

  println(
    Coin(1, "Dollar")
      + Coin(10, "Cent")
      + Coin(25, "Cent")
      + Coin(100, "Yen")
      + Coin(500, "Yen")
  )
  // Coin(54.15,Dollar)

}

Recommended Posts

Je veux que vous utilisiez Scala comme meilleur Java pour le moment
Utilisez une bibliothèque Java externe pour le moment
Liste de réglages de Glassfish que je souhaite conserver pour le moment
Je veux que vous utilisiez Enum # name () pour la clé de SharedPreference
Je souhaite utiliser l'API Java 8 DateTime lentement (maintenant)
Java14 est sorti, alors j'ai essayé d'enregistrer pour le moment
Introduction à Java pour la première fois # 2
Java12 est sorti, alors j'ai essayé l'expression switch pour le moment
Lorsque vous souhaitez utiliser la méthode à l'extérieur
Exécutez Dataflow, Java, Streaming pour le moment
Je souhaite également utiliser Combine dans UIKit.
[Java] Je souhaite calculer la différence par rapport à la date
Je veux aussi utiliser ES2015 avec Java! → (´ ・ ω ・ `)
Commande pour essayer d'utiliser Docker pour le moment
J'ai traduit [Méthode Clone pour les tableaux Java] comme méthode Clone dans les tableaux Java.
[Java] Utilisez ResolverStyle.LENIENT pour bien gérer la date et l'heure
Je souhaite renvoyer plusieurs valeurs de retour pour l'argument saisi
Je souhaite simplifier l'instruction if-else de la branche conditionnelle en Java
Je souhaite utiliser l'applet Java facilement sur la ligne de commande sans utiliser l'IDE
Utilisez JLine lorsque vous souhaitez gérer les frappes sur la console caractère par caractère en Java
Je veux revenir à l'écran précédent avec kotlin et java!
L'histoire de Collectors.groupingBy que je veux garder pour la postérité
Si vous souhaitez modifier l'environnement de développement Java d'Eclipse
[Java] Je veux effectuer distinctement avec la clé dans l'objet
Si vous souhaitez simuler une méthode dans RSpec, vous devez utiliser la méthode allow pour mock et la méthode singleton.
Un mémo lorsque vous souhaitez effacer la partie horaire de l'agenda
[Java] Comment utiliser la classe File
À propos de la procédure pour que Java fonctionne
Je souhaite utiliser DBViewer avec Eclipse 2018-12! !!
[Java] Comment utiliser la méthode toString ()
eclipse Je veux vraiment que vous utilisiez la touche de raccourci transcendantale recommandée (Windows)
[Traitement × Java] Comment utiliser la boucle
(Limité à Java 7 ou version ultérieure) Je souhaite que vous compariez des objets dans Objects.equals
[Java] Comment régler la date sur 00:00:00
[Traitement × Java] Comment utiliser la classe
Je veux arrêter complètement les mises à jour Java
Je souhaite obtenir l'adresse IP lors de la connexion au Wi-Fi avec Java
Apprendre pour la première fois java [Introduction]
[Traitement × Java] Comment utiliser la fonction
Je veux utiliser @Autowired dans Servlet
Je suis allé au Java Women's Club # 1
Je veux obtenir le nom de champ du champ [Java]. (Vieux ton d'histoire)
[Java Spring MVC] Je souhaite utiliser DI dans ma propre classe
[Java] Comment utiliser la classe Calendar
J'ai essayé de traduire la grammaire de R et Java [Mis à jour de temps en temps]
Utilisez la méthode l pour la notation temporelle
Vous pouvez ne pas vouloir utiliser la méthode remove sur ArrayList très souvent
[Eclipse] Je veux utiliser la fonction de complétion, mais je veux réussir à confirmer la complétion avec un espace
Je veux obtenir uniquement l'heure à partir des données de type Time ...! [Strftime] * Notes supplémentaires
[Deep Learning from scratch] en Java 1. Pour le moment, différenciation et différenciation partielle
Exécuter R à partir de Java Je veux exécuter rJava