
Alexander
08.02.2017
07:57:45
case class Address(street: String)
case class User(address: Address)
val u = Option(User(null))
u.map(_.address).map(_.street)
Джавист мне может и нул засунуть в конструктор, а подом упаду в рантайме.

KrivdaTheTriewe
08.02.2017
07:58:24
А где лучше почитать про оборачивание в опшн при матчинге и как внутри стдлиба такое автооборачивание пресекается ?

Юрий
08.02.2017
07:58:25
ну какбэ это стандартная библиотека, Option используется в куче мест. map также используется очень часто.

Google

Daniel
08.02.2017
07:58:27
в твоем примере опшн причем вообще?

Alexander
08.02.2017
07:58:36
Ну и вообще, какой тогда смысл в map?

Daniel
08.02.2017
07:58:45
какой смысл во всем
все тлен, пиши на го, там нет таких проблем

Юрий
08.02.2017
07:59:08
Some(null) - это конечно днище, то какбэ разрешенная вещь

Oleg
08.02.2017
07:59:22

Alexander
08.02.2017
07:59:49
А в Жаве почему по-другому сделано?

Daniel
08.02.2017
08:00:07
Some(null) это ссзб, не более того, семантика вполне адекватная

Oleg
08.02.2017
08:00:29

Daniel
08.02.2017
08:02:23

Sergey
08.02.2017
08:11:11
джавайские опшены вообще днище
чего стоит отсутствие вменяемого orElse

Google

Sergey
08.02.2017
08:12:00

Юрий
08.02.2017
08:12:46
Some(1).flatMap(_ => null) вообще не скомпилируется

Sergey
08.02.2017
08:12:59
чойто

Юрий
08.02.2017
08:13:19
а нет, этож null

Alexander
08.02.2017
08:13:46
Так оно так и должно работать. Сам обернёшь в опшн.

Grigory
08.02.2017
08:13:59
я с нулами если есть использоую Option конструктор :D он None при null и Some иначе

Sergey
08.02.2017
08:13:59
ну работают они в целом одинаково

Юрий
08.02.2017
08:14:39
семантика map по идее не подразумевает никаких дополнительных действий при маппинге. Оборачивание нула в опшон - это дополнительное дествие, что противоречит семантике

Sergey
08.02.2017
08:15:28
С одной стороны да, а с другой стороны опшены вообще появились, чтоб с null бороться, и он имеет особую семантику
Когда я вчера наткнулся на то, что в джаве Optional.map при резолве лямбды в null возвращает empty, я очень удивился) потом долго думал и решил, что какой-то смысл в этом есть
но неявность смущает, конечно

Nick
08.02.2017
08:17:18

Daniel
08.02.2017
08:17:22
еще раз, нельзя гарантировать, когда работаешь с null-API, что на null не повесили какую-то логику
этого шлака в энтерпрайзе полно
убирая null, вы испортите поведение
раз уж вы знаете, что вызываете, то и чекайте сами

Oleg
08.02.2017
08:20:30
И главный аргумент
def f: Int ⇒ String = _ => null
def g: String ⇒ Int = _ => 1
Some(0).map(f).map(g) == Some(0).map(f andThen g)
если бы map работал, как предложил @dosofredriver, Option бы банально не был бы функтором

Oleksandr
08.02.2017
08:21:07

Sergey
08.02.2017
08:21:30

Oleg
08.02.2017
08:21:31

Nick
08.02.2017
08:22:22
ух, когда дело доходит до инлаина, то эт жесть начинается)

Oleksandr
08.02.2017
08:22:53

Google

Oleg
08.02.2017
08:23:05

Nick
08.02.2017
08:23:28
а про какой инлаининг идет речь
jvm или scalac

Oleksandr
08.02.2017
08:23:54
ну вообще jvm
не скалас ведь байткоды гоняет

Nick
08.02.2017
08:26:10
но тем не менее скалак умеет делать инлаин в рамках баит кода
избегая виртуальщины

Oleksandr
08.02.2017
08:28:27

Nick
08.02.2017
08:28:59
ну если вы заговорили про jvm инлаин, то как его гарантировать)

Oleg
08.02.2017
08:29:02
@inline это вообще не гарантия

Nick
08.02.2017
08:30:03
Oleg ну почти гарантия

Oleksandr
08.02.2017
08:30:31

Oleg
08.02.2017
08:31:11
Oleg ну почти гарантия
даже и близко нет, насколько я понимаю, он при равном размере метода будет скорее оставлять помеченные, но не более

Oleksandr
08.02.2017
08:32:15
см. аргумент выше
я лично готов забить на потерю законов в некоторых корнер-кейсах с наллами (которых, по-хорошему, не должно быть в юзер апи) ради производительности

Nick
08.02.2017
08:32:17
Oleg если у тебя большой метод с кучей байткода внутри, то по сути он уже заинлаинин)

Alexander
08.02.2017
08:32:52
ну работают они в целом одинаково
Нет. Когда я делаю флэтмап, то гарантии по NULL'LESS висят на мне. Когда я делаю map, этим как-бы сам контейнер занимается. В итоге опшн, который, якобы, даёт какой никакой null safety нифига не даёт в случае с map.

Oleg
08.02.2017
08:33:02
я вообще не знаю языка с подобными метками, где можно было бы гарантировать инлайн, даже в С++ нет

Nick
08.02.2017
08:34:20
смотря о каком инлаине идет речь, повторюсь)
100% это конечно не возможно

Google

Oleg
08.02.2017
08:34:57

Alexander
08.02.2017
08:35:30

Oleg
08.02.2017
08:36:49

Oleksandr
08.02.2017
08:37:39
не пользуется он ими

Oleg
08.02.2017
08:37:50
пользуется, сам мне вчера сказал

Oleksandr
08.02.2017
08:37:50
максимум -- ожидает наличия

Oleg
08.02.2017
08:38:27
"А я, Олег, знаешь, частенько пользану закон-другой, когда дело за for заходит"

Admin
ERROR: S client not available

Oleksandr
08.02.2017
08:39:01
я могу сделать бредовый контейнер, которым, тем не менее, можно будет заюзать в форе

Oleg
08.02.2017
08:39:12
ДА
Например, Try
Или Future
И получишь херню, которую получишь
Поэтому не делайте бредовых контейнеров

Oleksandr
08.02.2017
08:40:25
пользуюсь фьючами, все ок
меньше фанатизма

Oleg
08.02.2017
08:43:34
Ну все пользуются, всем ок, потому что тут хреновая монада - благоразумие.
А портить опшн только ради толики подъёма производительности вопреки здравому смыслу никому не нужно.
Просто не используй Option в своём codeforces.

Vasily
08.02.2017
08:44:40
Слушайте, парни, а нельзя разве определить тип, который не будет позволять null? И процессить уже его

Alexander
08.02.2017
08:45:12

Oleg
08.02.2017
08:47:31
Как в котлине?
Kotlin's type system is aimed to eliminate NullPointerException's from our code. The only possible causes of NPE's may be
...
- External Java code has caused it
- There's some data inconsistency with regard to initialization (an uninitialized this available in a constructor is used somewhere)
И толку

Google

Alexander
08.02.2017
08:49:51
Ну я не писал почти на нём, не могу прокомментировать.

Daniel
08.02.2017
08:49:59

Oleg
08.02.2017
08:51:16

Daniel
08.02.2017
08:51:52
как боттом тип в скале выступают Nothing, Null и брошенные исключения

Daniel
08.02.2017
08:56:17
Null это подтип Nothing строго говоря

Vasily
08.02.2017
08:56:32
В F# можно написать, например type Price=int option
И хрен туда кто уже null прокинет

Daniel
08.02.2017
08:57:44
F# потому что не разрешает использовать null для "своих" типов

Oleg
08.02.2017
08:58:23
Технически это означало бы проверку на null каждый раз, когда ты присваиваешь своему типу что-то из небезопасной иерархии
Вот это реально ударило бы по перфомансу

Vasily
08.02.2017
09:00:12
Фишка в том, что подобное поведение отлавливается на уровне компиляции, по идее

Daniel
08.02.2017
09:00:53
в дотти возможно будет лучше, но я пейпер только начал читать, не могу точно сказать

Oleg
08.02.2017
09:02:08
если пересечение их широко
а оно настолько же широко, как сама java
проверок будет очень много

Vasily
08.02.2017
09:02:52
Ну гейта тут два вида, по идее - это или данные, которые надо десериализовать, или интероп
С интеропом жопа, согласен

Oleksandr
08.02.2017
09:11:27

Eugene
08.02.2017
09:43:51
Всем привет, ребята! Приятно видеть, что тут приличное такое количество людей
Я в Scala новичок, но хочу от нее пропереться :)
Сам под Android пишу, даже после Kotlin'a немного голова кружится.
В общем, нужен ваш совет.
Разрабатываю сервак (scala + play + anorm)
Выстроил схему бд и не знаю как быть с моделями.
Простой пример - есть сущность Company со стандартными полями типа id, title, и т.д.
И есть Product. Связь между ними 1:M.
Как лучше организовать модельку Company что бы удобно было делать выборку из бд, фаршировать объект и через api json'ом его отдавать?
На гитхабе как то не густо с этим делом. Приличных разжеванных примеров не видно. Или может я не так ищу :)