Scala和Java代码示例,其中Scala代码看起来更简单/行更少?

问题描述

让我们改进堆栈器的示例,并使用Scala的case类

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

上面的Scala类包含下面的java类的所有功能以及更多其他功能 -例如,它支持模式匹配(Java没有此功能)。Scala 2.8添加了命名和认参数,这些参数用于为案例类生成一个复制方法,它具有与以下java类的with *方法相同的功能

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 + ")";
    }
}

然后,在使用中(当然):

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

反对

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

我发现这令人印象深刻

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;
    }
}

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

解决方法

我需要一些Scala和Java代码的代码示例(并且我也对此感到很好奇),这些示例表明Scala代码比用Java编写的代码更简单,简洁(当然,两个示例都应该解决相同的问题)。

如果只有Scala示例带有注释,例如“这是Scala中的抽象工厂,在Java中看起来会很麻烦”,那么这也是可以接受的。

谢谢!

我最喜欢的所有接受和这个答案