ObservableValue.map special-cases the null value

John Hendrikx john.hendrikx at gmail.com
Wed May 17 01:08:21 UTC 2023


Hi Michael,

As you're only trying to map to true/false, it is a bit ugly to do this 
I suppose:

       nullableValue.map(x -> true).orElse(false);

I've encountered situations like these before, where you only want to 
know about the presence of a value, and don't care what the value is.  
If there are sufficient use cases, we could consider adding a method for 
this.  Instead of `mapNullable` though I was thinking more along the 
lines of `isPresent` and `isEmpty`:

       ObservableValue<Boolean> isPresent();  // true if not null

       ObservableValue<Boolean> isEmpty();  // true if null

So far I didn't think it would be warranted to add such methods, but 
they're trivial to add.

On 17/05/2023 00:25, Michael Strauß wrote:
> I'm trying to map an ObservableValue such that `null` is mapped to
> `false` and any other value is mapped to `true`. The following line of
> code should do the trick:
> ObservableValue<Boolean> mappedValue = nullableValue.map(x -> x != null);
>
> It turns out that this doesn't work, since `map` doesn't pass `null`
> to the mapping function. Instead of calling the mapping function, it
> always returns `null`. This is not technically a bug, as `map` is
> specified to have this behavior. It is a bit unfortunate, though;
> `null` is a perfectly valid value in many cases and its special
> treatment comes off as a bit of a surprise.

The alternative is worse I think, as JavaFX properties can easily be 
`null`, you'd have to add null checks to your map/flatMaps. Especially a 
construct like this:

       node.sceneProperty()
           .flatMap(Scene::windowProperty)
           .flatMap(Window::showingProperty)
           .orElse(false);

... would be really annoying to write if you had to deal with the 
nulls.  The functionality is closely related to what Optional offers, 
and that one doesn't pass `null` to its map/flatMap methods either, nor 
will it ever add a `mapNullable` :-)

> I'm wondering whether we need a `mapNullable` operator that does what
> I intuitively expecting `map` to do, which is just unconditionally
> passing the value to the mapping function.

Maybe, I think however that you'd only need this for the very special 
case where you are intending to ignore the actual value being passed to 
a map/flatMap, and only want to check it for null.  `isPresent` / 
`isEmpty` would be nicer for this.  For all other cases, where you are 
actually doing some kind of mapping, I think a map/orElse combo works great.

--John



More information about the openjfx-dev mailing list