Samples of Scala and Java code where Scala code looks simpler/has fewer lines? Samples of Scala and Java code where Scala code looks simpler/has fewer lines? java java

Samples of Scala and Java code where Scala code looks simpler/has fewer lines?


Let's improve stacker's example and use Scala's case classes:

case class Person(firstName: String, lastName: String)

The above Scala class contains all features of the below Java class, and some more - for example it supports pattern matching (which Java doesn't have). Scala 2.8 adds named and default arguments, which are used to generate a copy method for case classes, which gives the same ability as the with* methods of the following Java class.

public class Person implements Serializable {    private final String firstName;    private final String lastName;    public Person(String firstName, String lastName) {        this.firstName = firstName;        this.lastName = lastName;    }    public String getFirstName() {        return firstName;    }    public String getLastName() {        return lastName;    }    public Person withFirstName(String firstName) {        return new Person(firstName, lastName);    }    public Person withLastName(String lastName) {        return new Person(firstName, lastName);    }    public boolean equals(Object o) {        if (this == o) {            return true;        }        if (o == null || getClass() != o.getClass()) {            return false;        }        Person person = (Person) o;        if (firstName != null ? !firstName.equals(person.firstName) : person.firstName != null) {            return false;        }        if (lastName != null ? !lastName.equals(person.lastName) : person.lastName != null) {            return false;        }        return true;    }    public int hashCode() {        int result = firstName != null ? firstName.hashCode() : 0;        result = 31 * result + (lastName != null ? lastName.hashCode() : 0);        return result;    }    public String toString() {        return "Person(" + firstName + "," + lastName + ")";    }}

Then, in usage we have (of course):

Person mr = new Person("Bob", "Dobbelina");Person miss = new Person("Roberta", "MacSweeney");Person mrs = miss.withLastName(mr.getLastName());

Against

val mr = Person("Bob", "Dobbelina")val miss = Person("Roberta", "MacSweeney")val mrs = miss copy (lastName = mr.lastName)


I found this one impressive

Java

public class Person {    private final String firstName;    private final String lastName;    public Person(String firstName, String lastName) {        this.firstName = firstName;        this.lastName = lastName;    }    public String getFirstName() {        return firstName;    }    public String getLastName() {        return lastName;    }}

Scala

class Person(val firstName: String, val lastName: String)

As well as these ones (sorry for not pasting, I didn't want to steal the code)


Task: Write a program to index a list of keywords (like books).

Explanation:

  • Input: List<String>
  • Output: Map<Character, List<String>>
  • The key of map is 'A' to 'Z'
  • Each list in the map are sorted.

Java:

import java.util.*;class Main {  public static void main(String[] args) {    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);           }}

Scala:

object Main extends App {  val keywords = List("Apple", "Ananas", "Mango", "Banana", "Beer")  val result = keywords.sorted.groupBy(_.head)  println(result)}