- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当我将 flatMap
与 String
类型数组一起使用时,它没有给出任何警告,而在 Int
类型数组的情况下它会给出警告。为什么?示例:
let strings = [
"I'm excited about #SwiftUI",
"#Combine looks cool too",
"This year's #WWDC was amazing"
]
strings.flatMap{$0 + "."} //No warning
let ints = [
2,3,4
]
ints.flatMap{$0 + 1} //'flatMap' is deprecated: Please use compactMap(_:) for the case where closure returns an optional value
最佳答案
这是因为这是两种不同的flatMap
方法。
所以,在回答你的问题之前,让我们退后一步考虑一下 flatMap
现在的目的是,即对序列应用变换并连接结果序列。典型的例子是用于“展平”数组的数组):
let arrayOfArrays = [[1, 2], [3, 4, 5]]
let array = arrayOfArrays.flatMap { $0 }
print(array)
结果:
[1, 2, 3, 4, 5]
flatMap
已将数组数组扁平化为单个数组。
令人困惑的是,还有另一个现已弃用的 flatMap
它将执行转换,将可选结果展开到序列或集合中,但删除那些nil
。幸运的是,现在已更名为 compactMap
以避免混淆。所以,这就是您收到警告的原因。
考虑:
let input: [Int?] = [0, 1, nil, 3]
let results = input.flatMap { $0 } // 'flatMap' is deprecated: Please use compactMap(_:) for the case where closure returns an optional value
print(results)
结果:
[0, 1, 3]
因此,我们应该按照建议将 flatMap
替换为 compactMap
:
let input: [Int?] = [0, 1, nil, 3]
let results = input.compactMap { $0 }
print(results)
这将为我们提供所需的结果,而不会发出警告。
<小时/>那么,让我们回到你的例子。因为字符串是字符数组,所以它会根据您的意思并将其压平:
let strings = [
"I'm excited about #SwiftUI",
"#Combine looks cool too",
"This year's #WWDC was amazing"
]
let stringResults = strings.flatMap { $0 + "." }
print(stringResults)
其结果是一个扁平的字符数组:
["I", "\'", "m", " ", "e", "x", "c", "i", "t", "e", "d", " ", "a", "b", "o", "u", "t", " ", "#", "S", "w", "i", "f", "t", "U", "I", ".", "#", "C", "o", "m", "b", "i", "n", "e", " ", "l", "o", "o", "k", "s", " ", "c", "o", "o", "l", " ", "t", "o", "o", ".", "T", "h", "i", "s", " ", "y", "e", "a", "r", "\'", "s", " ", "#", "W", "W", "D", "C", " ", "w", "a", "s", " ", "a", "m", "a", "z", "i", "n", "g", "."]
这显然不是您想要的,但是编译器按照您的意思认为您想要将字符数组的数组(即字符串数组)展平为平面字符数组。这就是没有警告的原因。
<小时/>不用说,在您的示例中,您既不会使用 flatMap
(因为您没有处理数组的数组),也不会使用 compactMap
(因为您不是处理选项)。您只需使用map
:
let strings = [
"I'm excited about #SwiftUI",
"#Combine looks cool too",
"This year's #WWDC was amazing"
]
let stringsResults = strings.map { $0 + "." }
print(stringsResults)
let ints = [2, 3, 4]
let intsResults = ints.map { $0 + 1 }
print(intsResults)
<小时/>
完全不相关,但为了充分披露(但冒着使其更加困惑的风险),实际上还有另一个 flatMap
方法 (!),一种Optional
类型。诚然,这是有争议的,它比数组扁平化(即序列连接)再现更不常用,但我可能应该承认它的存在。
Optional
上的这个 flatMap
方法“当此 Optional
实例不 nil
时评估给定的闭包,传递展开的值作为参数。”但如果可选值为 nil
,则此 flatMap
也将返回 nil
。
例如:
func message(for value: Int?) -> String? {
return value.flatMap { "The value is \($0)" }
}
因此,如果value
为42
,结果将是可选字符串“The value is 42”
。但如果 value
为 nil
,则结果将为 nil
。
这个 flatMap
的演绎与当前的问题无关,但为了完整起见我想提及它。
关于ios - FlatMap 对 Int 类型数组发出警告,但对 String 类型数组则不发出警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58229147/
我有一个对象Foo,其中包含Bar列表。这些类的描述如下: class Foo { String name; List bars = new ArrayList(); Foo(
根据 Mozilla 开发者网站: flatMap() 方法首先使用映射函数映射每个元素,然后将结果展平到一个新数组中。它与 map 后跟深度为 1 的 flat 相同,但 flatMap 通常非常有
我对无法找到该问题的现有问题感到非常惊讶。这是为什么,鉴于: val p: Int => Option[Int] = Some(_) List(1, 2, 3).flatMap(p) 我得到: :14
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 5 年前。 Improve th
我想知道两种平面映射情况之间是否存在显着差异。 案例 1: someCollection .stream() .map(CollectionElement::getAnotherCol
以下是flatMap的定义取自 scala.util.Success。 final case class Success[+T](value: T) extends Try[T] { def fl
我正在寻找一个函数来展平列表数组。首先,我在 RDD 系统上使用 Apach Spark 函数 flatMap 实现了我的解决方案,但我想在本地执行此操作。但是,我无法找到 的等价物 samples
我想知道是否存在忽略 flatMap 中的结果的函数(在 scala 或 cat 中) .例如。 Some("ignore this").ignoreArgumentFlatMap(Some("res
我正在学习 Scala 并解决了 99 个 Scala 问题。对于以下练习: 展平嵌套列表结构。示例: scala> flatten(List(List(1, 1), 2, List(3, List(
当编译器进入无限循环时,是否有人遇到过使用此类 flatMap 链(或什至更长)的问题。 let what = Future.init { (promise) in promise(.succ
有没有更好的函数方式来写 flatMap ? def flatMap[A,B](list: List[A])(f: A => List[B]): List[B] = list.map(x =>
我试图从两个 中变出笛卡尔积潜在无限然后我通过 limit() 限制的流. 到目前为止,这(大约)是我的策略: @Test void flatMapIsLazy() { Stream.
为什么以下声明对 .map() 有效但不适用于 .flatMap() ? val tupled = input.map(x => (x*2, x*3)) //Compilation error:
我正在寻找可以同时映射和展平 Lists 和 Maybes 的代码。我在 this topic 中发现了这样一个 flatMap 函数: flatMap :: (t -> [a]) -> [t] ->
考虑在某些大小写匹配上编写的 flatMap。例如: list.flatMap( v => v match { case Cond1 => if(something) Some
我无法使用ListKOf平面映射T -> Option。 例如 listOf(1,2,3).k().flatMap { i -> if (i % 2 == 0) Some(i) else None
有人可以解释我如何在RxJava中通过flatMap运算符传递onComplete信号吗? 如果对flatMap运算符进行注释,则可以获取1到10的数字列表,这意味着toList将收到onComple
我正在做一个在线类(class)并误读了一个问题(这就是为什么我认为可以发布这个问题,因为答案与类(class)中的问题无关!)。 data class Trip( val drive
给定作为数据类的二维坐标列表 data class Point(val x: Int, val y:Int) val points: List 和 TornadoFX(Kotlin 中的 JavaFX
这个问题已经有答案了: What is the difference between .stream() and Stream.of? (5 个回答) 已关闭 3 年前。 我有以下代码: List p
我是一名优秀的程序员,十分优秀!