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


- Здесь getPS() возвращает Boolean, и, как оказалось, может быть NULL, соответственно с бросанием NPE..
А можно как-то одной строкой, не мостряча доп.проверку, например, также тернарным оператором, проверить на NULL, и, если не NULL, то вернуть соответствующие значения?
...
Рейтинг: 0 / 0
12.03.2019, 17:23
    #39784988
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тернарная проверка на NULL
Java это боль
Смирись
...
Рейтинг: 0 / 0
12.03.2019, 17:34
    #39784997
Kachalov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тернарная проверка на NULL
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
12.03.2019, 20:01
    #39785066
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тернарная проверка на NULL
mesierСори, если вопрос глупый, но что-то не могу допереть..
Код: java
1.
ac.getPs() ? "P" : "S"


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

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

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

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

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

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

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



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



Вам такая запись может и нагляднее, но объективно это не в нотации, и вообще, у меня редактор сам переносы расставит.. ))
betelgeizexА вот то, что в варианте тернарного оператора дважды вызывается getPs() - это объективный недочет.
А что делать!... В if-ах третьего-то не дано, приходится вот так.
...
Рейтинг: 0 / 0
13.03.2019, 12:49
    #39785321
betelgeizex
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тернарная проверка на NULL
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
13.03.2019, 12:57
    #39785327
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тернарная проверка на NULL
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
13.03.2019, 12:58
    #39785330
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тернарная проверка на NULL
betelgeizex"читабельнее" и "приятнее" - это чисто субъективный понятия :)вариант Kachalov лучше вашего. Вот и все.
...
Рейтинг: 0 / 0
13.03.2019, 13:00
    #39785333
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тернарная проверка на NULL
С тройной логикой я имел в виду. true|false|null
...
Рейтинг: 0 / 0
13.03.2019, 13:00
    #39785335
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тернарная проверка на NULL
maytonТернарная операция это уровень языка+1
И мне по барабану что двойной вызов.
Прикладник вызубрит эту особенность в оперативной памяти. Пока косяк не устранят.
...
Рейтинг: 0 / 0
13.03.2019, 13:06
    #39785338
betelgeizex
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тернарная проверка на NULL
mayton...
Надо всегда смотреть в стек. Сначала language. Его возможности. По максимуму решить задачу на этом уровне.
Тернарная операция это уровень языка. Самое перформансное решениею. Тем более что агрессивный оптимизатор
уже на этом уровне может строить свои предположения об оптимизации и вводить временные переменные и тому
подобное. Сюда-же до кучи null-безопасное разыменование (если оно поддерживается в языке) как в Groovy.

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



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


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

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

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

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

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



Это самый лучший вариант. Серьезно, этакий DSL... Но ТС хотел одной строкой, не мостряча )
...
Рейтинг: 0 / 0
13.03.2019, 13:21
    #39785356
Владимир П.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тернарная проверка на NULL
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
13.03.2019, 13:29
    #39785360
Озверин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тернарная проверка на NULL
Владимир П.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
13.03.2019, 13:30
    #39785363
Владимир П.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тернарная проверка на NULL
Озверинне, можно еще усложнить...наверное
Нафига?
...
Рейтинг: 0 / 0
13.03.2019, 13:48
    #39785379
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тернарная проверка на NULL
betelgeizexНапример, флаг, пришедший из БД. Или Query-параметр. Да куча вариантов.
Хорошо. Расскажите мне семантику этого флага. У нег 3 состояния.

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

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

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

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

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

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

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

да / нет / не знаю
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Тернарная проверка на NULL / 25 сообщений из 40, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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