powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Тернарная проверка на NULL
40 сообщений из 40, показаны все 2 страниц
Тернарная проверка на NULL
    #39784984
mesier
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сори, если вопрос глупый, но что-то не могу допереть..
Код: java
1.
ac.getPs() ? "P" : "S"


- Здесь getPS() возвращает Boolean, и, как оказалось, может быть NULL, соответственно с бросанием NPE..
А можно как-то одной строкой, не мостряча доп.проверку, например, также тернарным оператором, проверить на NULL, и, если не NULL, то вернуть соответствующие значения?
...
Рейтинг: 0 / 0
Тернарная проверка на NULL
    #39784988
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Java это боль
Смирись
...
Рейтинг: 0 / 0
Тернарная проверка на NULL
    #39784997
Kachalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mesierА можно как-то одной строкой, не мостряча доп.проверку, например, также тернарным оператором, проверить на NULL, и, если не NULL, то вернуть соответствующие значения?
- если null считать за false, то:
Код: java
1.
Boolean.TRUE.equals(ac.getPs()) ? "P" : "S"


- если null значащий:
Код: java
1.
ac.getPs() == null ? "some" : ac.getPs() ? "P" : "S"
...
Рейтинг: 0 / 0
Тернарная проверка на NULL
    #39785066
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mesierСори, если вопрос глупый, но что-то не могу допереть..
Код: java
1.
ac.getPs() ? "P" : "S"


- Здесь getPS() возвращает Boolean, и, как оказалось, может быть NULL, соответственно с бросанием NPE..
А можно как-то одной строкой, не мостряча доп.проверку, например, также тернарным оператором, проверить на NULL, и, если не NULL, то вернуть соответствующие значения?
Поскольку тернарная операция - это функция - то ты должен определить семантику NULL значения.
Ты не можешь вернуть НИЧЕГО.

С другой стороны если посмотреть на код который обрамляет эту функцию - то попробуй
перейти на Groovy с использованием null-safe operator. Это синтаксический сахар который
позволяет игнорировать действия над null-полями в объекте. И игнорировать рекурсивно
во вложениях.

Попробуй отказаться от Boolean и перейти на boolean-примитив если можно.
...
Рейтинг: 0 / 0
Тернарная проверка на NULL
    #39785214
betelgeizex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: java
1.
Optional.ofNullable(ac.getPs()).map(b -> b ? "P" : "S").orElse("null")
...
Рейтинг: 0 / 0
Тернарная проверка на NULL
    #39785233
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
betelgeizex
Код: java
1.
Optional.ofNullable(ac.getPs()).map(b -> b ? "P" : "S").orElse("null")

полностью извратился смысл компактного и читабельного. имхо
...
Рейтинг: 0 / 0
Тернарная проверка на NULL
    #39785253
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123betelgeizex
Код: java
1.
Optional.ofNullable(ac.getPs()).map(b -> b ? "P" : "S").orElse("null")

полностью извратился смысл компактного и читабельного. имхо
Тернарная операция все равно приятнее.
...
Рейтинг: 0 / 0
Тернарная проверка на NULL
    #39785288
betelgeizex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonPetro123пропущено...
полностью извратился смысл компактного и читабельного. имхо
Тернарная операция все равно приятнее.

"читабельнее" и "приятнее" - это чисто субъективный понятия :)
Мне, например, линейная цепочка вычислений более наглядна, чем пачка вложенных 'if'-ов v. пусть и с компактным синтаксисом.

Код: java
1.
if (ac.getPs() == null) then "some" else ( if (ac.getPs()) then "P" else "S")



А вот то, что в варианте тернарного оператора дважды вызывается getPs() - это объективный недочет.
...
Рейтинг: 0 / 0
Тернарная проверка на NULL
    #39785306
mesier
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
betelgeizex Мне, например, линейная цепочка вычислений более наглядна, чем пачка вложенных 'if'-ов v. пусть и с компактным синтаксисом.
Код: java
1.
if (ac.getPs() == null) then "some" else ( if (ac.getPs()) then "P" else "S")



Вам такая запись может и нагляднее, но объективно это не в нотации, и вообще, у меня редактор сам переносы расставит.. ))
betelgeizexА вот то, что в варианте тернарного оператора дважды вызывается getPs() - это объективный недочет.
А что делать!... В if-ах третьего-то не дано, приходится вот так.
...
Рейтинг: 0 / 0
Тернарная проверка на NULL
    #39785321
betelgeizex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mesierbetelgeizex ...
Код: java
1.
if (ac.getPs() == null) then "some" else ( if (ac.getPs()) then "P" else "S")


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



Разумеется, это не Java; это то, вот что у меня в голове превращается вариант с тернарным оператором :)

И это как раз я считаю _менее_ наглядным, чем вариант с Optional.

mesier
betelgeizexА вот то, что в варианте тернарного оператора дважды вызывается getPs() - это объективный недочет.
А что делать!... В if-ах третьего-то не дано, приходится вот так.

Даже если сейчас getPs() - тупой геттер, то через какое-то время в него могут попасть весьма тяжелые вычисления.
Надо избегать нескольких вызовов!
Например, сохранить результат в переменную, но тогда "как-то одной строкой" не получится.

А чем вас не устраивает однострочник с Optional ? Ну, кроме того, что символов больше? )
...
Рейтинг: 0 / 0
Тернарная проверка на NULL
    #39785327
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
betelgeizexmaytonпропущено...

Тернарная операция все равно приятнее.

"читабельнее" и "приятнее" - это чисто субъективный понятия :)
Мне, например, линейная цепочка вычислений более наглядна, чем пачка вложенных 'if'-ов v. пусть и с компактным синтаксисом.

Код: java
1.
if (ac.getPs() == null) then "some" else ( if (ac.getPs()) then "P" else "S")



А вот то, что в варианте тернарного оператора дважды вызывается getPs() - это объективный недочет.
Надо всегда смотреть в стек. Сначала language. Его возможности. По максимуму решить задачу на этом уровне.
Тернарная операция это уровень языка. Самое перформансное решениею. Тем более что агрессивный оптимизатор
уже на этом уровне может строить свои предположения об оптимизации и вводить временные переменные и тому
подобное. Сюда-же до кучи null-безопасное разыменование (если оно поддерживается в языке) как в Groovy.

Второй уровень - библиотеки. Optional.

Но проблема топика как всегда в изначальной постановке. Кому вообще нужен Boolean стройной логикой?
Что это за смысл? Да. Нет. И неопределено.
...
Рейтинг: 0 / 0
Тернарная проверка на NULL
    #39785330
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
betelgeizex"читабельнее" и "приятнее" - это чисто субъективный понятия :)вариант Kachalov лучше вашего. Вот и все.
...
Рейтинг: 0 / 0
Тернарная проверка на NULL
    #39785333
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С тройной логикой я имел в виду. true|false|null
...
Рейтинг: 0 / 0
Тернарная проверка на NULL
    #39785335
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonТернарная операция это уровень языка+1
И мне по барабану что двойной вызов.
Прикладник вызубрит эту особенность в оперативной памяти. Пока косяк не устранят.
...
Рейтинг: 0 / 0
Тернарная проверка на NULL
    #39785338
betelgeizex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton...
Надо всегда смотреть в стек. Сначала language. Его возможности. По максимуму решить задачу на этом уровне.
Тернарная операция это уровень языка. Самое перформансное решениею. Тем более что агрессивный оптимизатор
уже на этом уровне может строить свои предположения об оптимизации и вводить временные переменные и тому
подобное. Сюда-же до кучи null-безопасное разыменование (если оно поддерживается в языке) как в Groovy.

Второй уровень - библиотеки. Optional.



Так можно далеко зайти...
Пример: 'new' - уровень языка, DI container - библиотека.
Давайте откажемтся от DI и будем передавать зависимости руками? По максимуму использовать язык... ))


maytonНо проблема топика как всегда в изначальной постановке. Кому вообще нужен Boolean стройной логикой?
Что это за смысл? Да. Нет. И неопределено.

Например, флаг, пришедший из БД. Или Query-параметр. Да куча вариантов.
...
Рейтинг: 0 / 0
Тернарная проверка на NULL
    #39785344
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А просто функцию сделать?

Код: java
1.
2.
3.
<T> T nvl2(Boolean b, T whenTrue, T whenFalse, T whenNull) {
...
}
...
Рейтинг: 0 / 0
Тернарная проверка на NULL
    #39785346
betelgeizex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123betelgeizex"читабельнее" и "приятнее" - это чисто субъективный понятия :)вариант Kachalov лучше вашего. Вот и все.

Давайте на этом и остановимся. Конечно, вы правы.
...
Рейтинг: 0 / 0
Тернарная проверка на NULL
    #39785354
betelgeizex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alexey TominА просто функцию сделать?

Код: java
1.
2.
3.
<T> T nvl2(Boolean b, T whenTrue, T whenFalse, T whenNull) {
...
}



Это самый лучший вариант. Серьезно, этакий DSL... Но ТС хотел одной строкой, не мостряча )
...
Рейтинг: 0 / 0
Тернарная проверка на NULL
    #39785356
Фотография Владимир П.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey TominА просто функцию сделать?
Код: java
1.
2.
3.
<T> T nvl2(Boolean b, T whenTrue, T whenFalse, T whenNull) {
...
}


Тогда при вызове этой функции придётся пожертвовать принципом «short-circuit boolean evaluation», что не всегда приемлемо. Возможно, более удачным будет вариант с применением лямбд:

Код: java
1.
2.
3.
<T> T nvl2(Boolean b, Supplier<T> whenTrueSupplier, Supplier<T> whenFalseSupplier, Supplier<T> whenNullSupplier) {
...
}
...
Рейтинг: 0 / 0
Тернарная проверка на NULL
    #39785360
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир П.Alexey TominА просто функцию сделать?
Код: java
1.
2.
3.
<T> T nvl2(Boolean b, T whenTrue, T whenFalse, T whenNull) {
...
}


Тогда при вызове этой функции придётся пожертвовать принципом «short-circuit boolean evaluation», что не всегда приемлемо. Возможно, более удачным будет вариант с применением лямбд:

Код: java
1.
2.
3.
<T> T nvl2(Boolean b, Supplier<T> whenTrueSupplier, Supplier<T> whenFalseSupplier, Supplier<T> whenNullSupplier) {
...
}



не, можно еще усложнить...наверное
...
Рейтинг: 0 / 0
Тернарная проверка на NULL
    #39785363
Фотография Владимир П.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Озверинне, можно еще усложнить...наверное
Нафига?
...
Рейтинг: 0 / 0
Тернарная проверка на NULL
    #39785379
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
betelgeizexНапример, флаг, пришедший из БД. Или Query-параметр. Да куча вариантов.
Хорошо. Расскажите мне семантику этого флага. У нег 3 состояния.

Может стоило ввести 3 константы?
...
Рейтинг: 0 / 0
Тернарная проверка на NULL
    #39785383
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
betelgeizexТак можно далеко зайти...
Пример: 'new' - уровень языка, DI container - библиотека.
Давайте откажемтся от DI и будем передавать зависимости руками? По максимуму использовать язык... ))

Я протестую! Я этого не говорил. Аналогии с new/DI вообще неуместны.
Не стоит додумывать и добавлять новые смыслы. Моя позиция была
только по синтаксису логических условий.
...
Рейтинг: 0 / 0
Тернарная проверка на NULL
    #39785392
betelgeizex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonbetelgeizexНапример, флаг, пришедший из БД. Или Query-параметр. Да куча вариантов.
Хорошо. Расскажите мне семантику этого флага. У нег 3 состояния.

Может стоило ввести 3 константы?

Состояния очевидные: "Ответил ДА" / "Ответил НЕТ" / "Не ответил"

Можно ввести 3 статуса, не вопрос.
Но я бы не плодил новых сущностей и использовал бы всем известную семантику NULL-полей в RDBMS.

Как контрпример, можно рассмотреть другую семантику: "ДА"/"НЕТ"/"НЕ ПРИМЕНИМО" - вот тут три константы будут удобнее.
...
Рейтинг: 0 / 0
Тернарная проверка на NULL
    #39785396
am_sasa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
betelgeizex,

А для юзер интерфейса надо так:

да / нет / не знаю
...
Рейтинг: 0 / 0
Тернарная проверка на NULL
    #39785401
betelgeizex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonbetelgeizexТак можно далеко зайти...
Пример: 'new' - уровень языка, DI container - библиотека.
Давайте откажемтся от DI и будем передавать зависимости руками? По максимуму использовать язык... ))

Я протестую! Я этого не говорил. Аналогии с new/DI вообще неуместны.
Не стоит додумывать и добавлять новые смыслы. Моя позиция была
только по синтаксису логических условий.

Ну, вы указали на общность фразы:

авторНадо всегда смотреть в стек. Сначала language. Его возможности. По максимуму решить задачу на этом уровне...
Вот я и решил развить мысль.


Я понимаю, что мог не уловить смысла. Но тогда вопрос: в чем синтаксис логических условий принципиально отличается от остальных аспектов языка?
Почему для логических условий надо использовать язык по максимуму (предпочитая его библиотекам), я для прочих задач такой посыл вами не утверждается?
...
Рейтинг: 0 / 0
Тернарная проверка на NULL
    #39785410
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Давайте вернёмся к теме.
...
Рейтинг: 0 / 0
Тернарная проверка на NULL
    #39785508
teo609
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mesierСори, если вопрос глупый, но что-то не могу допереть..
Код: java
1.
ac.getPs() ? "P" : "S"


- Здесь getPS() возвращает Boolean, и, как оказалось, может быть NULL, соответственно с бросанием NPE..
А можно как-то одной строкой, не мостряча доп.проверку, например, также тернарным оператором, проверить на NULL, и, если не NULL, то вернуть соответствующие значения?

мне кажется, что null здесь может быть не getPS(), а ас.
Тогда все упрощается (далее по примеру от Kachalov)

ac == null ? "ac is null" : ac.getPs() ? "P" : "S"

потому что даже если getPS возвращает null, то для NPE нет повода, поскольку по этому null доступ не производится.
...
Рейтинг: 0 / 0
Тернарная проверка на NULL
    #39785513
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скорее всего у него используется Orm-фреймворк который формирует entity корректно
(не null) а различные поля этой entity вполне могут быть null ибо такова есть база данных.
Помним что реляционная алгебра позволяет делать дырки в таблице и это норм. Это не
дефект. И я думаю что его беспокоит именно предикат ac.getPs() == null т.к. она ломает
обычный порядок исполнения тернаной операции и заставляет делать еще одну лишнюю
проверку.
...
Рейтинг: 0 / 0
Тернарная проверка на NULL
    #39785519
teo609
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton,

я банально перепутал Boolean с boolean, почти не писал на яве.

А к вашему вопросу о логике трех состояний, ссылочный Boolean обусловлен языком, поэтому зачем ставить вопрос о его прикладной логике.
Кстати, поэтому и Optional мне не нравится как средство проверки на null, ведь логика может быть другой. Опциональность значения это по хорошему вопрос дизайна, а наличие null в ссылке может говорить не об этом, а об аварийной ситуации в процессе получения значения.
...
Рейтинг: 0 / 0
Тернарная проверка на NULL
    #39785531
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
teo609mayton,

я банально перепутал Boolean с boolean, почти не писал на яве.

А к вашему вопросу о логике трех состояний, ссылочный Boolean обусловлен языком, поэтому зачем ставить вопрос о его прикладной логике.
Кстати, поэтому и Optional мне не нравится как средство проверки на null, ведь логика может быть другой. Опциональность значения это по хорошему вопрос дизайна, а наличие null в ссылке может говорить не об этом, а об аварийной ситуации в процессе получения значения.
В данном конкретном кейсе Optional не нужен я считаю. Хотя он очень полезен когда вы работаете со Streams.
...
Рейтинг: 0 / 0
Тернарная проверка на NULL
    #39785536
mesier
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey TominА просто функцию сделать?
Код: java
1.
2.
3.
<T> T nvl2(Boolean b, T whenTrue, T whenFalse, T whenNull) {
...
}


Ну, да, вариант!
Хорошечно ещё и тем, что можно юнит-тест нарисовать. А то как-то юнит-тест для entity немного странно выглядит.. )))
...
Рейтинг: 0 / 0
Тернарная проверка на NULL
    #39785537
mesier
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonСкорее всего у него используется Orm-фреймворк который формирует entity корректно
(не null) а различные поля этой entity вполне могут быть null ибо такова есть база данных.
Помним что реляционная алгебра позволяет делать дырки в таблице и это норм. Это не
дефект. И я думаю что его беспокоит именно предикат ac.getPs() == null т.к. она ломает
обычный порядок исполнения тернаной операции и заставляет делать еще одну лишнюю
проверку.
Именно так.
...
Рейтинг: 0 / 0
Тернарная проверка на NULL
    #39785538
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mesier
Код: java
1.
ac.getPs() ? "P" : "S"


Интересно, что в шарпе это не скомпилируется если null возможен в возврате getPs()
...
Рейтинг: 0 / 0
Тернарная проверка на NULL
    #39785549
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mesier,
Если сущность, то не делай её тупой. Сделай поумнее, добавив метод возврата строки или
as.getPs().asString()
...
Рейтинг: 0 / 0
Тернарная проверка на NULL
    #39785566
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123mesier,
Если сущность, то не делай её тупой. Сделай поумнее, добавив метод возврата строки или
as.getPs().asString()
Это не совсем решение проблемы автора. Это просто перенос на другой уровень.
Кроме того надо помнить о потере соотвествия между ORM-entity и умной-entity.

Вобщем memento mori. Помни.
...
Рейтинг: 0 / 0
Тернарная проверка на NULL
    #39785567
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
Да. Все надо учитывать.
Представь 200 свойств с null и все тут с тернарными и троичной логикой.
Это лапша код будет.
...
Рейтинг: 0 / 0
Тернарная проверка на NULL
    #39785570
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не могу себе представить одно бизнес-действие с 200 свойствами.

Как вариант serialzation или метод toString но для него нет проблемы NPE. Она решена
на коробочном уровне.
...
Рейтинг: 0 / 0
Тернарная проверка на NULL
    #39785583
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
Я за то чтобы компилятор заругался на потенциальную ошибку.
Т.к. Для оператора? требуется только Да или Нет.
Imho
...
Рейтинг: 0 / 0
Тернарная проверка на NULL
    #39785586
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Согласен. Я-бы проверил исходник автора на SonarQube. Если тот заругается - то автор сам себе виноват. Не читает warnings.
...
Рейтинг: 0 / 0
40 сообщений из 40, показаны все 2 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / Тернарная проверка на NULL
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]