Scala分区/收集用法
是否可以使用一次拨打
collect
来制作2个新列表?如果没有,我怎么能用partition
做到这一点?
没有找到相关结果
已邀请:
6 个回复
程琶
(在TraversableLike上定义并在所有子类中可用)与集合和
一起使用。它也恰好在大括号内定义的一组case子句是一个部分函数(参见Scala语言规范的8.5节[警告 - PDF]) 与异常处理一样:
定义一个只接受给定类型的某些值的函数是一种方便的方法。 考虑在混合值列表中使用它:
方法的论点是
。
因为它没有为
类型的所有可能输入定义(即
的类型)和
,因为这是所有条款返回的内容。 如果您尝试使用
而不是
,则
末尾的双精度值将导致
。使用
只会丢弃它,以及未定义PartialFunction的任何其他值。 一种可能的用途是将不同的逻辑应用于列表的元素:
虽然这只是一个例子,但是使用这样的可变变量被许多人视为战争罪 - 所以请不要这样做! 更好的解决方案是使用两次收集:
或者,如果您确定该列表仅包含两种类型的值,则可以使用
,它将集合拆分为值,具体取决于它们是否与某些谓词匹配:
这里的问题是
和
都是
型,虽然你可以很容易地将它们强制回到更安全的东西(也许是通过使用
......) 如果您已经拥有一个类型安全的集合并想要拆分元素的其他一些属性,那么事情对您来说更容易:
希望总结一下这两种方法如何帮助你在这里!
吠强祷豪硅
而不使用可变列表,但
也可以使用模式匹配(只是更冗长一点)
凄挡
的签名,例如,
,是
这真的是一个特例
因此,如果你在默认模式下使用它,答案是否定的,肯定不是:你从中获得了一个序列。如果你按照
到
,你会发现有可能使
实际上是两个序列,但它无法被告知一个项目应该进入哪个序列,因为部分函数只能说“是的,我属于“或”不,我不属于“。 那么,如果你想要有多个条件导致你的列表被拆分成一堆不同的部分,你会怎么做?一种方法是创建一个指示器功能
,其中
被映射到编号的类,然后使用
。例如:
现在,您可以按类查找子列表(在本例中为0,1和2)。不幸的是,如果你想忽略一些输入,你仍然必须将它们放在一个类中(例如,在这种情况下你可能不关心
的多个副本)。
雇砰
和
实例)
稳赣苍卯改
的讲座,也不在乎这是否是某人的家庭作业。另外,我不想要只适用于
的东西。 所以这是我的努力。高效且兼容任何
,甚至字符串:
示例用法:
埃输林桨铃
开始,大多数集合现在都提供了一个
方法,该方法根据返回
或
的函数对元素进行分区。 这允许我们根据类型(作为
在分区列表中具有特定类型)或任何其他模式进行模式匹配: