实际上,plus
和plusElement
(minus
,minusElement
)函数与({mutable)List
函数之间有什么区别?
operator fun <T> Collection<T>.plus(element: T): List<T>
fun <T> Collection<T>.plusElement(element: T): List<T>
答案 0 :(得分:2)
除了plus
和minus
是operators并因此分别简化为grid.arrange
和+
之外,我想分享一个例子,这可能会使它更加很清楚,为什么plusElement
或minusElement
也可能有意义。基本上,当您不希望调用重载的运算符方法(例如plus(elements : Iterable<T>)
)时就是这种情况,在处理列表列表时可能就是这种情况。
也许以下示例更加清楚了。在样本中,所有变量分配均显示调用相应函数时分配的类型,并将结果包含在该行末尾的注释中。变量〜ending命名约定如下:
-
显示对PlusT
的呼叫plus(element : T)
显示对PlusIterable
的呼叫plus(elements : Iterable<T>)
显示对PlusElementT
的呼叫样品:
plusElement(element : T)
如您所见,使用val someEntry = "some entry"
val listOfSomeEntry = listOf(someEntry)
val los : List<String> = listOf("listOfString")
val lsPlusT : List<String> = los.plus(someEntry) // [listOfString, some entry]
val lsPlusIterable1 : List<String> = los.plus(listOfSomeEntry) // [listOfString, some entry]
val lsPlusIterable2 : List<Any> = los.plus(listOf(listOfSomeEntry)) // [listOfString, [some entry]]
val lsPlusElementT1 : List<String> = los.plusElement(someEntry) // [listOfString, some entry]
val lsPlusElementT2 : List<Any> = los.plusElement(listOfSomeEntry) // [listOfString, [some entry]]
val lol : List<List<String>> = listOf(listOf("listOfList"))
// the following is basically not really correct as we are now dealing with a list of lists of strings, but it shows that llPlusT and llPlusIterable lead to the same (in this case probably wrong) result..
val llPlusT : List<Any> = lol.plus(someEntry) // [[listOfList], some entry]
val llPlusIterable : List<Any> = lol.plus(listOfSomeEntry) // [[listOfList], some entry]
val llPlusIterable2 : List<List<String>> = lol.plus(listOf(listOfSomeEntry)) // [[listOfList], [some entry]]
val llPlusElement1 : List<Any> = lol.plusElement(someEntry) // [[listOfList], some entry]
val llPlusElement2 : List<List<String>> = lol.plusElement(listOfSomeEntry) // [[listOfList], [some entry]]
时可能会使用重载的变体+
,这在大多数情况下可能有意义,但在其他情况下(例如, (大多数情况下)处理列表列表时。您可能希望使用plus(elements : Iterable<T>)
(+
)或确定要添加,而不是强制+ listOf(anotherList)
使用plusElement
添加列表列表。您可能只想忽略一个元素,而忽略plusElement(anotherList)
,而推荐使用plus
(这可能是一种非常罕见且非常特殊的用例,将在变体plusElement
中得到体现)。 / p>
最后,llPlusElement1
或plusElement
的命名清楚地表明,您传递的内容反映了列表中的一项,而minusElement
的内容基本上是开放的……(您但是,应该从上下文中看出这一点,无论如何,带有列表列表的内容可能仍然不清楚;-))。最后是免责声明:这并不意味着您应该使用列表列表,而是以防万一您发现类似+
的东西;-)
答案 1 :(得分:1)
第一个是重载运算符,如operator
关键字所示。它允许您将+
运算符与List<T>
一起使用。
第二个是常规函数,以常规函数调用样式调用。
两者都返回一个新的List<T>
,并附加了element
。
Kotlin REPL的成绩单:
>>>val a = listOf(1, 2, 3)
>>>a + 4
[1, 2, 3, 4]
>>> a.plusElement(4)
[1, 2, 3, 4]
有关Kotlin运算符重载的更多信息,请参见https://kotlinlang.org/docs/reference/operator-overloading.html。