Scala条件列表构造

标签 scala collections

我正在使用Scala 2.9.2,并希望根据某些条件构造一个列表。

考虑以下情况,其中cond是一些函数,该函数采用谓词p和类型T的值(在这种情况下为t3):

t1 :: t2 :: cond( p, t3 ) :: t4

我想要的行为如下。如果p为true,则应为:
List[T]( t1, t2, t3, t4 )

如果p评估为false,则应该给出:
List[T]( t1, t2, t4 )

我可能在想这是完全错误的方法,但我一直在努力提出一个优雅的解决方案。我可能到处都涉及选项,然后进行过滤,但这使代码更难阅读:
def cond[T]( p : => Boolean, v : T ) : Option[T] =
{
    p match
    {
        case true => Some( v )
        case false => None
    }
}

这允许以下内容:
scala> ( Some( 1 ) :: Some( 2 ) :: cond( true, 3 ) :: Some( 4 ) :: Nil ).flatten
res4: List[Int] = List(1, 2, 3, 4)

scala> ( Some( 1 ) :: Some( 2 ) :: cond( false, 3 ) :: Some( 4 ) :: Nil ).flatten
res5: List[Int] = List(1, 2, 4)

但是,这不是最优雅的解决方案,因为它要求用户将所有非条件元素包装在Some()中,并且还记得最后要进行展平。谁能想到一个更优雅的解决方案?

最佳答案

如何产生一个列表?

@inline def cond[T]( p : => Boolean, v : T ) : List[T] = if(p) v::Nil else Nil

然后像这样使用它们:
List(1,2,3) ++ cond(false, 3 ) ++ List(4)

关于Scala条件列表构造,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15568634/

相关文章:

python - 更改 databricks 笔记本的默认语言

java - 如何根据合并规则将 2 个枚举器合并为一个

Scala:标记化和字典

C 语言标准集在哪里?

scala - 在 Scala 中实现惰性列表的惰性 val

c# - C# 中 Scala 的列表的协变和逆变 Monadic 类型

java - 从 NavigableSet 中获取特定索引处的元素

c# - 并发下的 Queue<T> 为不同的类型提供不同的结果

c# - 字典的多键查找

java - 持久类是否应该初始化实例变量集合