问题描述
让我们改进堆栈器的示例,并使用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中看起来会很麻烦”,那么这也是可以接受的。
谢谢!
我最喜欢的所有接受和这个答案