Respostas:
Use a distinct
função de extensão :
val a = arrayOf("a", "a", "b", "c", "c")
val b = a.distinct() // ["a", "b", "c"]
Também existe uma distinctBy
função que permite especificar como distinguir os itens:
val a = listOf("a", "b", "ab", "ba", "abc")
val b = a.distinctBy { it.length } // ["a", "ab", "abc"]
Como @ mfulton26 sugerido, você também pode usar toSet
, toMutableSet
e, se você não precisa a ordenação original a ser preservado, toHashSet
. Essas funções produzem um em Set
vez de a List
e devem ser um pouco mais eficientes do que distinct
.
Você pode achar útil:
toSet
ou toMutableSet
que têm menos sobrecarga do que distinct
e se o pedido não importa, você pode usar toHashSet
.
to*Set
é mais eficiente (espaço e tempo) do que distinct[By]
porque retorna o Set
diretamente em vez de usar um Set
internamente e convertê-lo em um List
como seu valor de retorno e 2) distinctBy
é pode ser mais eficiente do que distinct
simplesmente porque você pode evitar a comparação completa da igualdade do objeto. Ambos são pontos válidos. Corri com sua declaração de que "certamente nem sempre tem sobrecarga" e estava respondendo a isso e esqueci que você estava comparando distinct
com distinctBy
(e não com to*Set
).
Iterable.distinct
na verdade o faz toMutableSet().toList()
internamente. Portanto, não se preocupe com o desempenho :-)