Quel que soit les caractéristiques de la Scala, je trouve qu'il est très difficile à lire. Et oui, les petites bribes semble OK pour le lire, mais de grands programmes sembler intimidant. La lisibilité des projets complexes est mon #1 au mieux pour n'importe quelle langue. Pour la même raison, une énorme base de VB.net existe toujours et est préféré par beaucoup de développeurs par rapport à la plus capable C#.net -- code VB est facile à lire et à digérer.
Java est plus verbeux, sans aucun doute. Cependant, il est superbement documenté pour toutes sortes d'applications. En revanche, la Scala a très peu de soutien à l'apprentissage. Java 8 ajoute Lambdas, de nouvelles bibliothèques, et avec la plupart de ce que Java a déjà fait un très bon travail.
Lors de la comparaison de Java 8 et Scala, être conscient de ces problèmes
Les fonctionnalités qui sont vraiment caractéristiques
Maintenant, c'est un Scala fonctionnalité et j'espère Java 9 va faire quelque chose comme ceci:
case class Foo(bar: String, baz: String)
Pour générer une classe Java avec égal à égal, hashcode et toString, getters et setters,comme ça, eh bien, il serait un pain PITA. Cependant, je ne trouve pas moi-même de générer beaucoup de ces types de " cas " des classes.
Tout Foo que je fais, en général on a de la logique et de comportements sous les couvertures et de le faire est presque la même dans les deux Scala et Java.
Si je n'ai besoin de Java est quelque chose d'organiser un 'bar' et un 'baz', puis-je utiliser une Carte. C'est vrai, le tout-flexible, de fantaisie sans Carte!
Map map = new HashMap(){{
put("bar","this is a bar entry");
put("baz","this is a baz entry");
}}
Tout ce que je veux dire, c'est ... il y a des alternatives à des classes de cas et elles ne sont pas si difficile que de faire un plein de classe Java.
Pour ne pas dire que des classes de cas ne serait-il pas agréable (Java 9, écoutez-vous!) parce qu'ils sont vraiment une caractéristique de la valeur pour les quelques cas (no pun intended) où des cas, il permettrait de résoudre certains cas.
Les fonctionnalités qui sont vraiment non-caractéristiques
Scala
def saySomething(t: Human): String = t match {
case Human(_, "Hanks") => "Run Forrest, run!"
case Human(_, "Hardy") => "No, Bane, no!"
}
println(saySomething(tom))
Java
public String saySomething(Human human){
switch(human.getSurname()){
case: "Hanks" return "Run Forrest, run!";
case: "Hardy" return "No, Bane, no!";
default: return "";
}
}
System.out.println(saySomething(tom))
C'est à peine une différence, si vous me demandez, et je trouve que le code Java est plus facile à comprendre.
Maintenant, j'ai été -1 avais pour ne pas montrer comment Scala Pattern Matching est tellement génial. Jusqu'à présent, quelqu'un a commenté avec cet exemple, Quel est l'avantage de l'utilisation de la scala de filtrage au lieu de java commutateur cas? Et franchement, ça semble compliqué, mais je ne vois pas l'intérêt de faire les choses de cette façon.
Java raccourcis souvent oubliée
Scala fans utilise des exemples de ce genre pour montrer ce que Scala peut faire. En regardant Riche importations dans la réponse sélectionnée ci-dessus, nous avons Java:
JFrame windowFrame = new JFrame()
windowFrame.setSize(300, 200);
windowFrame.getContentPane().setLayout(null);
windowFrame.add(getJLabel(), null);
windowFrame.add(getJTextField(), null);
windowFrame.add(getJButton(), null);
windowFrame.setTitle("HelloWorld");
Scala avec de riches importations
val windowFrame = new JFrame()
{
import windowFrame._
setSize(300, 200);
getContentPane().setLayout(null);
add(getJLabel(), null);
add(getJTextField(), null);
add(getJButton(), null);
setTitle("HelloWorld");
}
Mais avec Java il est également possible de le faire de cette façon:
JFrame windowFrame = new JFrame(){{
setSize(300, 200);
getContentPane().setLayout(null);
add(getJLabel(), null);
add(getJTextField(), null);
add(getJButton(), null);
setTitle("HelloWorld");
}};
De nouvelles fonctions Lambda
Évaluation Différée
En Scala, il y a le "paresseux" mot:
lazy val result = {
// ... here goes really heavy processing I want to avoid right now and make on call
}
Java 8 a un Supplier<T>
qui peut également memoize et a l'avantage de permettre une date d'expiration:
Supplier<Complex> result = Supplier.memoize( ()-> {
// here goes really heavy processing
})
Maintenant, je vais vous avouer que la Scala de code est concis. Cependant, il ne confère pas le type d'informations pour le programmeur d'un coup d'oeil. Je connais le Java 8 Fournisseur est de type 'T' ou dans le ci-dessus, de type 'Complexe'. Java 8 permet également l'utilisation d'une date d'expiration de la méthode:
Supplier<Complex> result = Supplier.memoizeWithExpiration(Supplier<T> delegate, long duration,TimeUnit unit)
Pour les Paresseux, j'aime bien le Java 8 mieux parce que: (a) Il confère type d'informations pour le programmeur; (b) c'est un 'Supplier
qui décrit plus précisément la fonction que quelque chose peut-être qui n'existe pas déjà; (c) elle a une date d'expiration qui est très utile pour le web, les applications et le besoin de certains objets à être rafraîchi après une période de temps. Java 8 Fournisseur est thread-safe.
L'itération d'une Carte
Dans Java 8, à l'aide de Lambda rend également plus facile de travailler avec des collections et d'autres types. Il n'est plus besoin de le faire:
for(Map.Entry<Key,Value> entry: map.getEntrySet()) {
Key key = entry.getKey();
Value value = entry.getValue();
// do something with them
}
Parce que maintenant vous pouvez le faire:
m.forEach((k, v) -> System.out.println("key: " + k + " value: " + v));
Une boucle dans une plage de valeurs
Java 8 ajoute une nouvelle boucle mécanisme qui peut éventuellement être 1 ou 0 en fonction:
IntStream.rangeClosed(1,10).forEach( System.out::println );
Comparaison Des Pièges
À l'aide d'anciennes fonctionnalités
Il y a beaucoup de mauvais exemples de Java vs Scala, où l'auteur a utilisé le pire Java technique et l'a comparé avec le meilleur Scala technique.
Voici une comparaison des vieux Java pour le nouveau Java 8 vs Scala. L'auteur pose la question pour une fonction qui fait cela:
- Entrée: Liste
- Sortie: Carte>
- La clé de la carte est 'A' à 'Z'
- Chaque liste dans la carte sont triés.
Old Java
List<String> keywords = Arrays.asList("Apple", "Ananas", "Mango", "Banana", "Beer");
Map<Character, List<String>> result = new HashMap<Character, List<String>>();
for(String k : keywords) {
char firstChar = k.charAt(0);
if(!result.containsKey(firstChar)) {
result.put(firstChar, new ArrayList<String>());
}
result.get(firstChar).add(k);
}
for(List<String> list : result.values()) {
Collections.sort(list);
}
System.out.println(result);
Java 8
List<String> keywords = Arrays.asList("Apple", "Ananas", "Mango", "Banana", "Beer");
Map<Character, List<String>> result = keywords.stream().sorted()
.collect(Collectors.groupingBy(it -> it.charAt(0)));
System.out.println(result);
Scala
val keywords = List("Apple", "Ananas", "Mango", "Banana", "Beer")
val result = keywords.sorted.groupBy(_.head)
println(result)
Ainsi, vous pouvez le voir avec Java 8, si vous savez la nouvelle façon, vous pouvez réduire le code considérablement et il est également très facile à lire. Encore une fois, il n'y a pas beaucoup de différence, le cas échéant, entre le Java 8 et Scala dans cet exemple. Sans doute, la Java 8 Flux et les fonctions de Mappage maintenant peut-être mieux de la Scala.
Oublier d'utiliser utile bibliothèques
Il y a beaucoup de puissants bibliothèques Java qui n'beaucoup de ce qui est soigneusement présenté dans Scala et souvent beaucoup plus.
Bien sûr, vous pourriez créer votre propre code pour traiter les chaînes de caractères dans les Scala, et il aurait l'air plus propre, mais pourquoi ne pas juste prendre [http://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/StringUtils.html][1] et d'apprendre ce qu'il peut faire pour vous?
Conclusion
Quand vous voyez un Scala vs Java exemple, demandez-vous: est-ce que le meilleur, le plus souple, le plus concis moyen de le faire en Java? L'auteur n'a examiner populaire de Java bibliothèques open source? L'auteur montre le même code de gestion d'erreur dans chaque langue pour la mise en œuvre? L'auteur n'a omettre de l'information en tapant à faire Scala paraître plus propre?
Scala est en avance de Java, à de nombreux égards. Scala est plus rapide de prototype dans IFAIAC. Cependant, certains développeurs, la Scala, la langue est encore difficile de code et de le conserver.
Comme une alternative à Java, Groovy 2.0 vaut également le détour. Il peut maintenant être à la fois typées dynamiquement et statiquement typé (comme Java et Scala) et j'aime la syntaxe bien mieux que la Scala. Et il est même plus rapide que la Scala pour le prototypage. Groovy aussi travaille côte à côte avec Java et offre des capacités Web avec leur live systèmes de modèle. Groovy est de Java sur les stéroïdes. Groovy est juste incroyablement groovy.
J'encourage tout le monde à apprendre Scala et les maîtriser. Le plus intelligent que les développeurs seront également en Java pour et obtenir les meilleurs emplois parce qu'ils peuvent faire à la fois.
Pour le moment, je ne vois pas de raison convaincante pour passer de Java à la Scala basé sur les caractéristiques de la Scala offre. Ils sont sympas, mais pas de deal breakers pour moi. Vous vous décidez pour vous-même.