我是scala的新手,我无法理解以下功能
val L = List(List(1, 1), 2, List(3, List(5, 8)))
def flatten(l: List[Any]): List[Any] = l flatMap {
case ms:List[_] => flatten(ms)
case l => List(l)
}
flatten(L) // res2: List[Any] = List(1, 1, 2, 3, 5, 8)
Run Code Online (Sandbox Code Playgroud)
特别是我不理解第一种情况的组合flatMap和模式匹配以及意义ms:List[_]
有人可以解释一下,也许可以提供一个更简单的例子来澄清这个概念吗?
我将输入一组行作为输入并跟踪字长的分布.额外的空白区域(包括输入中的换行符)无关紧要.在输入结束后,输出是基于文本的字长分布直方图:例如:"嘿,你好,你好"
输出:1 - 0,2 - 1,3 - 5,4 - 1,5 - 0
where(第一个字符是单词的长度,第二个字符是该长度的单词).我已经写了
val lines = scala.io.Source.stdin.getLines
val words = lines.flatMap(_.split("\\W+"))
Run Code Online (Sandbox Code Playgroud)
我想组合相同长度的单词,然后将它们存储在迭代器或映射中
val list2 = words.groupby(e.length => e.length).mapValues(_.length)
Run Code Online (Sandbox Code Playgroud)
没有给我想要的结果.有什么建议?
考虑在某些大小写匹配上编写的 flatMap。例如:
list.flatMap( v =>
v match {
case Cond1 => if(something) Some(Int) else None
//..Other conditions yielding Option[Int]
case CondN => if(somethingelse) Seq(Int) else Seq()
})
Run Code Online (Sandbox Code Playgroud)
但是这不会编译。如果 seq 是 Option[Int] 的全部或 Seq[Int] 的全部,则 flatMap 可以工作。但如果 Seq 是选项和 Seq 的混合,则不然。为什么会有这样的限制?这是否解决了我现在无法想到的特定歧义。
EDIT1 从 REPL 添加代码片段
scala> val a = Seq(Option(1), Seq(2,3))
a: Seq[Equals] = List(Some(1), List(2, 3))
scala> val b = Seq(Seq(1), Seq(2,3))
b: Seq[Seq[Int]] = List(List(1), List(2, 3))
scala> a.flatMap(x=>x)
<console>:9: error: type mismatch;
found : Equals
required: scala.collection.GenTraversableOnce[?]
a.flatMap(x=>x) …Run Code Online (Sandbox Code Playgroud) 我有一个对象列表,每个对象内部都有一个其他对象类型的列表。我想提取这些列表并创建另一个对象的新列表。
List1:[Obj1, Obj2, Obj3]
Obj1.myList = [O1, O2, O3]
Obj2.myList = [O4, O5, O6]
Obj3.myList = [O7, O8, O9]
Run Code Online (Sandbox Code Playgroud)
我需要这个:
L = [O1, O2, O3, O4, ...., O9];
我试过了extend(),reduce()但没有用
bigList = reduce(lambda acc, slice: acc.extend(slice.coresetPoints.points), self.stack, [])
Run Code Online (Sandbox Code Playgroud)
聚苯乙烯
寻找 python flatten 列表列表没有帮助,因为我得到了其他对象的列表列表。
在这个例子中,我必须上课.
Order(selections: List<Selection>, discount: Double, ...)
Selection(productId: Long, price: Double, ...)
Run Code Online (Sandbox Code Playgroud)
然后我继续收集Order我想要计算之后需要使用的价格Selection's price和Order's discount.我怎样才能做到这一点?
我尝试执行以下操作,但似乎不可能.
val orderList: List<Order> = loadFromDB()
orderList.map { Pair(it.selections, it.discount) }
.flatMap { /* Here I want to get list of Pair of selection from all orders with discount. */}
Run Code Online (Sandbox Code Playgroud)
一旦我收集了,Pair(Selection, discount)那么我可以继续进一步计算.这可能以这种形式吗?我需要将链条分开吗?
我该如何合并List<Map<String,String>>到Map<String,String>使用flatMap?
这是我尝试过的:
final Map<String, String> result = response
.stream()
.collect(Collectors.toMap(
s -> (String) s.get("key"),
s -> (String) s.get("value")));
result
.entrySet()
.forEach(e -> System.out.println(e.getKey() + " -> " + e.getValue()));
Run Code Online (Sandbox Code Playgroud)
这不起作用.
给定一个如下所示的复杂对象:
case class Complex
(
id: Long,
name: String,
nested: Seq[Complex]
)
Run Code Online (Sandbox Code Playgroud)
在实际操作中,这可能会变成这样:
val stuff =
List(
Complex(1, "name1",
List(
Complex(2, "name2", List()),
Complex(3, "name3",
List(
Complex(4, "name4", List())
)
)
)
)
)
Run Code Online (Sandbox Code Playgroud)
我需要将其变成一个平面Complex对象列表,将所有子/孙子拉起来。
val flattened =
List(
Complex(1, "name1", List()),
Complex(2, "name2", List()),
Complex(3, "name3", List()),
Complex(4, "name4", List()),
)
Run Code Online (Sandbox Code Playgroud)
您对我如何实现这一目标有任何线索/想法吗?
我尝试过的其他解决方案似乎只做简单的列表嵌套。我尝试过的事情:
这些似乎都产生了与我开始时相同的列表。
我尝试使用此代码:
let vowels: [Character] = ["a","e","i","o","u", "y"]
let replaced = String(myString.map {
$0 == vowels.contains($0) ? "1" : "0"
})
Run Code Online (Sandbox Code Playgroud)
但我有错误:
Binary operator '==' cannot be applied to operands of type 'Character' and 'Bool'
怎么了?
我已经从flatMap/compactMap用于flatten数组数组的多个教程中进行了遍历,但就我而言,它不起作用或无法正确理解。
let myArray = [["Raja","Kumar", nil,"Waqas"],["UAE","SINGAPORE","dUBAI","HONGKONG"]]
let final = myArray.compactMap{ $0 }
print("Result:\(final)")
Run Code Online (Sandbox Code Playgroud)
输出:
Result:[[Optional("Raja"), Optional("Kumar"), nil, Optional("Waqas")], [Optional("UAE"), Optional("SINGAPORE"), Optional("dUBAI"), Optional("HONGKONG")]]
Run Code Online (Sandbox Code Playgroud)
我尝试从上述数组中删除nil,但仍然不能使我的数组变平。
任何帮助将非常感激。
自定义类对象中特定字段的 Java 流
我有一个ArrayList对象Train。
每个Train都有三个字段:source、destination、cost。
我想获取所有地名,即所有不同的来源+目的地。
我正在使用下面的代码,但正如可以观察到的那样,我使用两个流来检索数据。
List<String> destinations = list.stream()
.map(x -> x.getDestination())
.distinct()
.collect(Collectors.toList());
List<String> sources = List.stream()
.map(x -> x.getSource())
.distinct()
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
我想知道如何在单个流中完成同样的事情?可以使用 来完成吗flatMap,还是有其他方法可以实现这一目标?
List<String> allPlaces = ?
Run Code Online (Sandbox Code Playgroud)
另外,是否可以使用Train没有吸气剂的类?