Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
* Returns the largest value among all values produced by [selector] function
* applied to each element in the collection.
*
* @throws NoSuchElementException if the collection is empty.
*/
@SinceKotlin("1.4")
@OptIn(kotlin.experimental.ExperimentalTypeInference::class)
@OverloadResolutionByLambdaReturnType
@kotlin.internal.InlineOnly
public inline fun <T, R : Comparable<R>> Iterable<T>.maxOf(selector: (T) -> R): R {
val iterator = iterator()
Я бы просто проверил на пустоту перед началом вычислений. У тебя же, скорее всего, вся задача не имеет смысла на пустой коллекции, а не только поиск максимума.
fun getPetuh(): Petuh? {
return if (koko==pepe) Petuh() else null
}
fun doPetuh() {
val petuh = getPetuh() ?: return //если нул то и всё
petuh.koko() //никакого NPE
}
так понятно?
теперь
fun guiness() {
val oldiestPetuhAge = petuhs.maxOrNull { petuh.age } ?: return
println("The oldiest petuh is $oldiestPetuhAge ")
}
Почему это бы что-то означало? max(empty) = -inf - естественная питушня как для математики, так и для программирования.
1. Определим максимум как минимальное значение, для которого не существует элементов множества больше этого значения.
То есть располагаем элементы на этажах и смотрим, за кем первым приедет лифт (спускающийся лифт символизирует минимизацию этого значения).
Если кто-то был, лифт первым приедет за максимумом по высоте. Определение максимума работает и даёт интуитивно понятный результат.
Если никого не было, лифт уедет в подвал. Определение расширяет понятие максимума на пустое множество, называя минимальный элемент домена или минус бесконечность максимумом пустого множества.
2. max = -inf; foreach(x in xs) if (x > max) max = x;
Такой алгоритм даёт максимум для непустого множества и без переписывания кода называет минимальный элемент домена или минус бесконечность максимумом пустого множества.
И питушня (1) в математике, и питушня (2) в программировании являются простыми питушнями, которые могут выдержать поединок на бритве Оккама, согласуются между собой и указывают на -inf без пердолинга с доопределениями.
max(empty) = empty
А у тебя ничего и "минус бесконечность" стали тождественны, это ерунда. Так можно лишь для оптимизации, чтобы не ебаться с монадами там, где нет смазки.
> max(empty) = empty
Это какая-то нетипизированная питушня, которой стыдливо прикрывают (void*)0.
Уважающий себя максимум должен быть из домена, к которому принадлежит элемент множества. Как минимум, в программировании.
max({{{empty}}}) = {{empty}}
max({{empty}}) = {empty}
max({empty}) = empty
max(empty) = -inf
> у тебя ничего и "минус бесконечность" стали тождественны
у разработчиков SQL ничего и "минус бесконечность" стали тождественны потому, что у них max(empty) = empty.
чтобы посчитать max по коллекции типа Т достаточно лишь иметь стабильный оператор < (T, T)
а оператором < можно хоть двух лысых чертей сравнивать, например, два массива друг с другом (сравнение строк - частный случай сравнения массивов) или два кортежа
не понимаю где тут место для -inf
> вот -inf - мог бы, а MIN_INT нет
Какая между ними разница?
1. Определим максимум целых чисел из диапазона как минимальное значение, для которого не существует элементов множества больше этого значения.
То есть располагаем элементы на этажах и смотрим, за кем первым приедет лифт (спускающийся лифт символизирует минимизацию этого значения).
Если кто-то был, лифт первым приедет за максимумом по высоте. Определение максимума работает и даёт интуитивно понятный результат.
Если никого не было, лифт уедет в подвал. Определение расширяет понятие максимума на пустое множество, называя минимальный элемент диапазона максимумом пустого множества.
2. max = -INT_MIN; foreach(x in xs) if (x > max) max = x;
Такой алгоритм даёт максимум для непустого множества интов и без переписывания кода называет минимальный элемент из интов (INT_MIN) максимумом пустого множества.
И питушня (1) в математике, и питушня (2) в программировании являются простыми питушнями, которые могут выдержать поединок на бритве Оккама, согласуются между собой и указывают на INT_MIN без пердолинга с доопределениями.
В базах данных любой тип может содержать null, поэтому это удобно. А здесь придётся возвращать какой-нибудь nullable<T>, который потом никуда не засунуть без проверки...
В крестах размотка стека тоже ничем не отличается от обычного возврата... Там только определение текущей позиции всё портит, емнип (я не про студию и костыль с SEH, а про нормальные zero-cost).
MAKAKA # 0
как это удобно.
Предлагаю не мелочиться, и кидать NoSuchElementException при попытке итерации по пустой коллекции
пидары
bormand # 0 ⇈
MAKAKA # 0 ⇈
но я бы сделал так: max(default=0) {..}
или
maxOrNull{..} ?: 0
последнее мож и е, надо прове
bormand # 0 ⇈
guest # 0 ⇈
bormand # 0 ⇈
Это косплей на пёрловский or die что ли?
MAKAKA # 0 ⇈
так понятно?
теперь
18-летняя Ганнуся - самая старая курица в мире
bormand # 0 ⇈
Desktop # 0 ⇈
Nil coalescing или как-то так
На J это похоже не больше, чем классический тернарник 🙂
MAKAKA # 0 ⇈
bormand # 0 ⇈
MAKAKA # 0 ⇈
в JS тоже есть такая идиома с ||, она везде может быть, где любой тип приводится к булу
guest # 0 ⇈
MAKAKA # 0 ⇈
guest # 0 ⇈
bootcamp_dropout # 0 ⇈
MAKAKA # 0 ⇈
А такого элемента нет
1024-- # 0 ⇈
1. Определим максимум как минимальное значение, для которого не существует элементов множества больше этого значения.
То есть располагаем элементы на этажах и смотрим, за кем первым приедет лифт (спускающийся лифт символизирует минимизацию этого значения).
Если кто-то был, лифт первым приедет за максимумом по высоте. Определение максимума работает и даёт интуитивно понятный результат.
Если никого не было, лифт уедет в подвал. Определение расширяет понятие максимума на пустое множество, называя минимальный элемент домена или минус бесконечность максимумом пустого множества.
2. max = -inf; foreach(x in xs) if (x > max) max = x;
Такой алгоритм даёт максимум для непустого множества и без переписывания кода называет минимальный элемент домена или минус бесконечность максимумом пустого множества.
И питушня (1) в математике, и питушня (2) в программировании являются простыми питушнями, которые могут выдержать поединок на бритве Оккама, согласуются между собой и указывают на -inf без пердолинга с доопределениями.
defecate-plusplus # 0 ⇈
А у тебя ничего и "минус бесконечность" стали тождественны, это ерунда. Так можно лишь для оптимизации, чтобы не ебаться с монадами там, где нет смазки.
1024-- # 0 ⇈
Это какая-то нетипизированная питушня, которой стыдливо прикрывают (void*)0.
Уважающий себя максимум должен быть из домена, к которому принадлежит элемент множества. Как минимум, в программировании.
max({{{empty}}}) = {{empty}}
max({{empty}}) = {empty}
max({empty}) = empty
max(empty) = -inf
> у тебя ничего и "минус бесконечность" стали тождественны
у разработчиков SQL ничего и "минус бесконечность" стали тождественны потому, что у них max(empty) = empty.
defecate-plusplus # 0 ⇈
а max(length(col)) например?
а max(name) from person?
defecate-plusplus # 0 ⇈
а оператором < можно хоть двух лысых чертей сравнивать, например, два массива друг с другом (сравнение строк - частный случай сравнения массивов) или два кортежа
не понимаю где тут место для -inf
1024-- # 0 ⇈
max({length(...)} \ {length(...)}) = 0
max({name(...)} \ {name(...)}) = ""
MAKAKA # 0 ⇈
вот -inf - мог бы, а MIN_INT нет
но у целых чисел нет инфа в погромировании
1024-- # 0 ⇈
Какая между ними разница?
1. Определим максимум целых чисел из диапазона как минимальное значение, для которого не существует элементов множества больше этого значения.
То есть располагаем элементы на этажах и смотрим, за кем первым приедет лифт (спускающийся лифт символизирует минимизацию этого значения).
Если кто-то был, лифт первым приедет за максимумом по высоте. Определение максимума работает и даёт интуитивно понятный результат.
Если никого не было, лифт уедет в подвал. Определение расширяет понятие максимума на пустое множество, называя минимальный элемент диапазона максимумом пустого множества.
2. max = -INT_MIN; foreach(x in xs) if (x > max) max = x;
Такой алгоритм даёт максимум для непустого множества интов и без переписывания кода называет минимальный элемент из интов (INT_MIN) максимумом пустого множества.
И питушня (1) в математике, и питушня (2) в программировании являются простыми питушнями, которые могут выдержать поединок на бритве Оккама, согласуются между собой и указывают на INT_MIN без пердолинга с доопределениями.
gost # 0 ⇈
Тебя укусил карманный лев, проверь.
1024-- # 0 ⇈
-INT_MIN в том комментарии следует читать как INT_MIN.
> max = -INT_MIN; foreach(x in xs) if (x > max) max = x;
max = INT_MIN; foreach(x in xs) if (x > max) max = x;
defecate-plusplus # 0 ⇈
bormand # 0 ⇈
gostinho # 0 ⇈
Ну это совсем пиздец же.
bormand # 0 ⇈
MAKAKA # 0 ⇈
bormand # 0 ⇈
Да нет, просто он сам настолько тормозной, что исключения на этом фоне не заметны. А второй вызов или боксинг в тупл заметен будет.
MAKAKA # 0 ⇈
gost # 0 ⇈
bormand # 0 ⇈
MAKAKA # 0
OCETuHCKuu_nemyx # 0
OCETuHCKuu_nemyx # 0 ⇈
Именно поэтому я за "PHP".
guest # 0 ⇈
guest # 0 ⇈
один с нулом, Да
а еще лучше с дефолтом
Мистер Хэнки # 0
Да и вообще много похожих методов сделаны в двух вариантах - с исключением и с null -
first/firstOrNull, last/lastOrNull, single/singleOrNull и тд
1024-- # 0 ⇈
bormand # 0 ⇈
guest # 0 ⇈
1024-- # 0 ⇈
Вообще, где у нас zapret-info.govnokod.ru со списком уёбков с пояснениями и датами, кто и за что их таковыми признал?
guest # 0 ⇈
Пример: https://govnokod.ru/14669#comment218119
bormand # 0 ⇈