繁体   English   中英

Scala不可变列表添加“单元”元素

Scala immutable lists adding a 'Unit' element

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我是scala的初学者,我正在寻找最好/惯用的方式去做我打算在这里做的事情。

这就是我想要做的

def someMethod(obj:MyObj):List[String] = {
     List[String]() +: 
      {if (somecondition is satisfied) .. " element"} +: 
      { if (another condition) .. " something else " }


}

也就是说,该方法检查输入参数对象的某些属性,并将元素添加到List(即要返回)。 如果没有满足任何条件,则应返回空列表。

  1. 当然代码不能编译。 但不知何故,我觉得List [T] + Unit应该返回List [T]。 为什么我错了?

并且2.请告诉我正确的方法来做Scala。 如果我在一系列条件上进行迭代,我可以使用理解。

4 个回复

我宁愿使用一元或空列表,而不是过滤单位:

def someMethod(obj:MyObj): List[String] = {
    Nil ++
    ( if (somecondition is satisfied) List(" element") else Nil ) ++
    ( if (another condition) .. List(" something else ") else Nil ) ++
}

编辑:关于下面的评论,如果你发现上面的代码太冗长和难以维护,你仍然可以创建一个辅助函数:

def optElem[T]( condition: Boolean)( value: => T ): Option[T] = if ( condition ) Option( value ) else None
def someMethod(obj:MyObj): List[String] = {
  Nil ++
  optElem (somecondition is satisfied)( " element") ++
  optElem (another condition)(" something else " )
}

if - else是Scala中的表达式。 你写的内容变成了:

List[String]() +: 
      {if (somecondition is satisfied) {" element"; () } else () }+: 
      { if (another condition) { " something else "; () } else () }

如您所见,常见的分支类型是Unit

整个表达式的类型是List[Any]因为这是StringUnit的常见超类型。

一些方法来实现你想要的:

// #1. Ugly.
def someMethod(obj:MyObj):List[String] = {
  val xs = List[String]() 
  val xs1 = if (somecondition is satisfied) xs :+ " element" else xs
  val xs2 = if (another condition) xs1 :+ " something else" else xs1
  xs2
}

// #2. Better, but uses mutable builder.
def someMethod(obj:MyObj):List[String] = {
  val b = List.newBuilder[String]
  if (somecondition is satisfied) b += " element"
  if (another condition) b += " something else"
  b.result
} 

// #3. Best way IMO, but computationally expensive.
def someMethod(obj:MyObj):List[String] = {
  List[String]() ++
  Option("element").filter(some condition) ++ // for more correct semantics
                                              // use LazyOption from Scalaz.
  Option("something else").filter(another condition)
} 

你可以这样写:

def someMethod(obj:MyObj):List[String] = {
     List(
      if (somecondition is satisfied) " element", 
      if (another condition) " something else "
     ) collect{ case x: String => x }
}

假设所有条件都失败了:您将首先按List(Unit,Unit)结束List(Unit,Unit)然后按类型过滤 单位不满足收集内的类型条件,因此结果将为空列表

好处是,与filter方法不同, collect选择尽可能紧密的类型(因此你将获得字符串序列 - 这将来自收集中的函数)。

另一种可能性是用flatten替换.collect { ... } ,但你会丢失类型信息。

另一种观点是构建一个选项列表,然后展平列表。

def f(obj: MyObj): List[String] = {
  List(if (cond1(obj)) Some("element")        else None,
       if (cond2(obj)) Some("something else") else None).flatten
}
1 在Scala中将元素添加到不可变列表

在Scala中,将元素添加到不可变列表的方式如下: 这意味着您首先创建一个Nil(空)列表,然后向其添加2,然后添加1。即,这些操作是右相关的。 因此,实际上,可以用更清晰的方式重写它,如下所示: 问题是,如果List应该保留插入顺序,并且如果先将2添加到一个空列表中,然后再添 ...

2 什么是从不可变列表中“删除”一个元素的惯用Scala方法?

我有一个List,它可能包含比较相等的元素。 我想要一个类似的List,但删除了一个元素。 所以从(A,B,C,B,D)我希望能够“移除”一个B来得到例如(A,C,B,D)。 结果中元素的顺序无关紧要。 我有工作代码,在Scala中用Lisp启发的方式编写。 有没有比较惯用的方法呢 ...

2011-04-12 14:19:24 12 81779   list/ scala
3 Scala:如何扩展不可变列表

程序的许多方法都将List [Map [String,String]]作为参数。 我想通过定义一个类来使其规范化,使其更具可读性: 但是它抛出一个错误: 有适当的处理方法吗? ...

4 Scala中的不可变列表

我只是想弄清楚像List这样的不可变事物是如何工作的,以及如何向其中添加事物? 我很抱歉提出这样愚蠢的问题,但是为什么在打印时我的列表总是空白? 很抱歉给您带来不便和这个愚蠢的问题! ...

5 如何“更新”Scala中不可变集合中的不可变元素?

我有一Set元素,它们在键周围定义了相等,但其他字段可能不同......所以当我需要'更新'时,这就是我尝试过的: 添加已经存在的元素将不会更改集合,并且首先将其删除并再次添加更新似乎是次优的。 union方法在左侧保留集合的元素,但是没有记录该行为; 所以我不应该依赖它。 ...

7 在forEach中将元素添加到不可变列表

我有一个不可变的映射,其中每个键是一个任意类别(这些将是一个列表)。 然后,我有了每个类别必须具有的字符串数组。 如果特定类别不包含该字符串,则会将其添加到地图内的相应列表中。 我希望循环完成后, categories将相应地更新。 但是,当我尝试console.log categ ...

8 将元素添加到不可变列表时出错

以下代码段无法编译(给出错误消息,报告不兼容的类型): 但是,如果我将更多元素添加到列表中,例如下面的代码 它编译没有问题。 谁能告诉我为什么会这样,以及如何在不进行强制转换的情况下解决? ...

9 将单个元素添加到不可变列表

我只想将元素添加到不可变对象树中某个位置的列表中。 这个问题似乎已经在这里回答了: 将值附加到列表 但是由于某种原因,它对我不起作用。 如果我有以下代码: 我得到一个错误: 未捕获的TypeError:无法读取未定义的属性“推” 这表示传递给回调 ...

10 Java - 向不可变列表添加一个元素

我需要一个不可变列表,在那里我可以派生出第二个不可变列表,保留前一个列表的所有元素以及 Java 中的一个附加元素(没有附加库)。 注意:这个问题类似于将单个元素添加到不可变集合的有效且优雅的方法是什么? 但我需要一个清单,而且没有番石榴。 到目前为止我尝试过的: 这会起作用,但创建一 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM