【问题标题】:Create and add Objects to a list in Scala [closed]在Scala中创建对象并将其添加到列表中[关闭]
【发布时间】:2019-03-11 15:21:10
【问题描述】:

我是 Scala 的新手,我一直坚持创建一个对象并将其添加到 Scala 中的对象列表中。我想在scala中做下面的java实现。请提出合适的方法。

class Foo {
    private int x;
    private int y;

    public Foo(int x, int y){
        this.x = x;
        this.y = y;
    }

    public int getX(){
        return x;
    }
    public void setX(int x){
        this.x = x;
    } 
    public int getY(){
        return y;
    }
    public void setY(int y){
        this.y = y;
    }
}

class Main {
    List<Foo> fooList = new ArrayList<>();
    Foo foo = new Foo(1,2);
    fooList.add(foo);

} 

【问题讨论】:

标签: java scala


【解决方案1】:

最简单的方法是使用case class:

case class Foo(x: Int, y: Int)

class Main {
   def main(args: Array[String]) = {
     val myList = List(Foo(10, 20))
   }
}

但是,此代码不提供修饰符 setX 和 setY。原因是在 Scala 中,您通常创建新对象而不是更新旧对象。这使对象保持“不可变”并使代码更清晰、更安全。

因此,与其调用foo.setX(4),不如创建一个更新值为x 的新foo:

val newFoo = foo.copy(x = 4)

习惯用这种方式编写代码需要一段时间,但 Scala 的特性有助于使这更容易(例如上面的 copy 方法)。生成的代码更安全、更易于理解,因为您知道 x 和 y 在您的脚下不会改变。

这也鼓励了一种更具功能性的风格,其中输入值通过一系列函数转换为输出值。这与命令式风格形成鲜明对比,在这种风格中,输入对象通过将其转换为输出对象的方法进行变异。

【讨论】:

【解决方案2】:

尝试了下面的代码;有用。

class Foo(a: Int, b: Int) {
    var thisA: Double = a
    var thisB: Double = b
}

class Main {
    def main(args: Array[String]) = {

         var myList= List[Foo]()
         val listObject= new Foo(10,20)
         myList::= listObject
    }
}

【讨论】:

  • 最好避免使用vars(并使用vals)。您应该阅读有关类和案例类之间的区别。现在你不用thisA,thisB。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-04
  • 1970-01-01
  • 2013-08-09
  • 2021-04-13
相关资源
最近更新 更多