Kotlin-集合plus()×plusElement()的区别

时间:2018-12-05 13:21:03

标签: list collections kotlin

实际上,plusplusElementminusminusElement)函数与({mutable)List函数之间有什么区别?

operator fun <T> Collection<T>.plus(element: T): List<T>

fun <T> Collection<T>.plusElement(element: T): List<T>

2 个答案:

答案 0 :(得分:2)

除了plusminusoperators并因此分别简化为grid.arrange+之外,我想分享一个例子,这可能会使它更加很清楚,为什么plusElementminusElement也可能有意义。基本上,当您不希望调用重载的运算符方法(例如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>

最后,llPlusElement1plusElement的命名清楚地表明,您传递的内容反映了列表中的一项,而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