powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Тернарная проверка на NULL
25 сообщений из 40, страница 1 из 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
25 сообщений из 40, страница 1 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / Тернарная проверка на NULL
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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