Kotlin - коллекция плюс () × плюсElement () разница - PullRequest
0 голосов
/ 05 декабря 2018

В чем разница между функциями plus и plusElement (minus, minusElement) над (неизменяемыми) List на практике?

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

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

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

Помимо plus и minus, являющихся операторами и, следовательно, упрощенными до + и - соответственно, я хотел бы поделиться примером, это может сделать более понятным, почему plusElement или minusElement также может иметь смысл использовать.По сути, это тот случай, когда вы не хотите, чтобы вызывались перегруженные операторные методы (например, plus(elements : Iterable<T>)), что может быть в случае, когда вы имеете дело со списком списков.

Возможно, следующие примеры проясняют ситуацию.В примерах все присвоения переменных показывают тип, который они получили при вызове соответствующей функции, и содержат результат в комментарии в конце строки.Соглашение об окончании именования является следующим:

  • 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 (вероятно, очень редкий и очень особый вариант использования ... это будет отражено в варианте llPlusElement1).

Наконец, plusElement или minusElementиз наименования проясните, что то, что вы передаете, отражает 1 единственный элемент списка, тогда как + оставляет это в основном открытым ... (однако вы должны увидеть это из контекста, который со списком списка, вероятно, не таков).очистить в любом случае ;-)).И отказ от ответственности в конце: это не должно означать, что вы должны использовать список списков, но на случай, если вы найдете что-то подобное, у вас есть plus/minusElement под рукой; -)

0 голосов
/ 05 декабря 2018

Первый оператор является перегруженным, как указано в ключевом слове 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...