Лямбда-аргумент следует убрать из скобок - PullRequest
0 голосов
/ 19 ноября 2018

IntelliJ дает следующую жалобу:

Лямбда-аргумент должен быть удален из скобок

val profile = loadProfiles()
profile.sortedWith(Comparator({ profile1, profile2 ->
                if (profile1.age > profile2.age) return@Comparator 1
                if (profile1.age < profile2.age) return@Comparator -1
                return@Comparator 0
            }))

data class Developer(var age: Int)

fun loadProfiles(): List<Developer> {
    val listOfNumber = listOf<Developer>(Developer(2), Developer(5), Developer(3))

    return listOfNumber
}

Как мне отформатировать вышеприведенное, чтобы избавиться от жалобы?Кроме того, код сортировки не сортируется.В чем причина проблемы?

Ответы [ 3 ]

0 голосов
/ 19 ноября 2018

Это предупреждение вызвано тем, что в Kotlin параметры labda могут (и должны быть) вне скобок.

Смотрите это:

fun onClick(action: () -> Unit) { ... }

Когда вы используете такую ​​функцию, вы можете использовать:

view.onClick({ toast(it.toString())} )
view.onClick() { toast(it.toString()) }
view.onClick { toast(it.toString()) }

Все эти формы верны (компилятор не потерпит неудачу), но в Руководстве по стилю Kotlin вы найдете следующее утверждение:

Если вызов принимает одну лямбду, он должен быть передан вне скобки, когда это возможно.

@ см. https://kotlinlang.org/docs/reference/coding-conventions.html#lambda-formatting

Вот почему IntellJ показывает предупреждение. Вы можете нажать alt + enter, и IntellJ должен показать правильное решение, или просто убрать лямбду из скобок. И если labda является единственным аргументом, удалите также скобки. Когда лямбда должна быть в скобках? Только когда это не последний параметр в функции.

0 голосов
/ 19 ноября 2018

Что касается вашей непосредственной проблемы, вам просто нужно написать ее так:

profile.sortedWith(Comparator { profile1, profile2 ->
            if (profile1.age > profile2.age) return@Comparator 1
            if (profile1.age < profile2.age) return@Comparator -1
            return@Comparator 0
        }
)

Однако в коде все еще есть несколько слоев ненужной детализации.Вот несколько способов сделать его более лаконичным и более читабельным.

  1. Удалите оператор return:

    profile.sortedWith(Comparator { profile1, profile2 ->
        if (profile1.age > profile2.age) 1
        else if (profile1.age < profile2.age) -1
        else 0
    })
    
  2. Использование when вместо if-else каскада:

    profile.sortedWith(Comparator { profile1, profile2 ->
        when {
            profile1.age > profile2.age -> 1
            profile1.age < profile2.age -> -1
            else -> 0
        }
    })
    
  3. использовать Int.compareTo:

    profile.sortedWith(Comparator { profile1, profile2 ->
        profile1.age.compareTo(profile2.age) 
    }
    
  4. использовать compareBy:

    profile.sortedWith(compareBy(Profile::age))
    
  5. Не используйте общий sortedWith, когда все, что вам нужно sortedBy:

    profile.sortedBy(Profile::age)
    
0 голосов
/ 19 ноября 2018

sortedWith (): возвращает список всех элементов, отсортированных в соответствии с указанным [компаратором]

Таким образом, для сортировки списка profile необходимо назначить список, возвращаемый sortedWith() на profile (также измените его объявление с val на var)

var profile = loadProfiles()
profile = profile.sortedWith(Comparator { profile1, profile2 ->
    if (profile1.age > profile2.age) return@Comparator 1
    if (profile1.age < profile2.age) return@Comparator -1
    return@Comparator 0
})

profile.forEach { println(it.age) }

или

val profile = loadProfiles().sortedWith(Comparator { profile1, profile2 ->
    if (profile1.age > profile2.age) return@Comparator 1
    if (profile1.age < profile2.age) return@Comparator -1
    return@Comparator 0
})

Для предупреждения: нажмите Alt + Enter и дайте InteliJ сделатьизменение.

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