code: public static <S, R> ObjectBinding<R> map(ObservableValue<S> source, Function<? super S, ? extends R> function, R defaultValue){
          return Bindings.createObjectBinding(()->{
              S sourceValue = source.getValue();
  
              if(sourceValue == null){
                  return defaultValue;
              }else{
                  return function.apply(sourceValue);
              }
          }, source);
      }
docs: A null safe binding that holds the return value of the given function when applied to the value of the given observable.
  
  If the observable has a value of `null` the given default value (third param) will be used as value for the binding instead.
  
  The given function will never get `null` as param so you don't need to check for this.
  
  See {@link #map(javafx.beans.value.ObservableValue, java.util.function.Function, Object)} for a detailed explanation of
  the binding.
  
  @param source the observable value that is the source for this binding.
  @param function a function that maps the value of the source to the target binding.
  @param defaultValue the default value that is used when the source observable has a value of `null`.
  @param <S> the generic type of the source observable.
  @param <R> the generic type of the resulting binding.
  @return the created binding.