旁注:如果你不重新分配,
val
比
var
.
val my = listOf("abc","cef")
val bb = my.toList()
这里是
my
是
List<String>
,其元素是
"abc"
和
"cef"
.
的类型
bb
是
列表<字符串>
因为
List
转化为
表
,
它的元素是
“ABC”
和
“CEF”
.
即。,
我的
和
BB
是等效的,尽管它们是不同的实例。你不需要
BB
.
var ok1 = my.flatMap {it.toList()}
这和
var ok1 = listOf<Char>() // empty List
for (it in my) {
// `it` is the `String` type.
// For the 1st iteration, it = "abc"
// For the 2nd iteration, it = "cef"
val chars: List<Char> = it.toList() // String is transformed into List of Chars
ok1 = ok1 + chars
}
var ok2 = my.flatMap { bb }
这和
var ok2 = listOf<String>() // empty List
for (it in my) {
// `it` is the `String` type.
// For the 1st iteration, it = "abc"
// For the 2nd iteration, it = "cef"
ok2 = ok1 + bb // You know, bb = listOf("abc, "cef")
}
所以,
ok2 = bb + bb
(for循环重复两次,因为
我的
有2个元素。)
这意味着
ok2 = listOf("abc", "cef") + listOf("abc", "cef")
这意味着
ok2 = listOf("abc", "cef", "abc", "cef")
val ok3=my.flatMap { it } //It's wrong
这和
var ok3 = listOf<?>() // empty List
for (it in my) {
// `it` is the `String` type.
// For the 1st iteration, it = "abc"
// For the 2nd iteration, it = "cef"
ok3 = ok3 + it
}
ok3
一定是
表
类型。然而,
it
是
String
类型,类型不匹配。
所以,编译错误!
如果需要连接
表
属于
弦
,您可以使用
joinToString()
方法。
val my = listOf("abc", "cef")
val concat = my.joinToString("") // insert empty string between elements.
请参阅
Kotlin standard library document of
List
.
fun <T, R> Iterable<T>.flatMap(
transform: (T) -> Iterable<R>
): List<R>
返回从以下结果生成的所有元素的单个列表:
正在对原始元素的每个元素调用转换函数
收藏。
假设一个变量
list
具有类型
List<T>
.
如果我们想执行
val newList = list.flatMap(function)
然后
function
应具有函数类型
(T) -> Iterable<R>
.
(
功能
的参数是
T
-类型,然后重新运行
Iterable<R>
.
表
是的子类型
Collection
和
Collection is a subtype of
可迭代的
, so
表
is a subtype of
不可复制`.)
newList
将具有类型
List<R>
.
它
问题中的参数将是
功能
.
所以,
它
将
T
-类型,不是
列表<t>
-类型。
即。,
它
将
弦
-类型,不是
列表<字符串>
-类型。