Skip to content

Add "optional" variants -- shortValueOpt(), floatValueOpt(), asShortOpt(), asFloatOpt() #5158

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
May 12, 2025
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 40 additions & 0 deletions src/main/java/tools/jackson/databind/JsonNode.java
Original file line number Diff line number Diff line change
Expand Up @@ -754,6 +754,16 @@ public String asText(String defaultValue) {
*/
public abstract short shortValue(short defaultValue);

/**
* Method similar to {@link #shortValue()}, but that will return empty
* {@link Optional<Short>} ({@code Optional.empty()}) if this node cannot
* be converted to Java {@code short}.
*
* @return Java {@code short} value this node represents, as {@link Optional<Short>},
* if possible to accurately represent; {@code Optional.empty()} otherwise
*/
public abstract Optional<Short> shortValueOpt();

/**
* Method similar to {@link #shortValue()} but in addition to coercing Number
* values (same as {@link #shortValue()}), will also try to coerce a
Expand Down Expand Up @@ -788,6 +798,16 @@ public String asText(String defaultValue) {
*/
public abstract short asShort(short defaultValue);

/**
* Method similar to {@link #asShort()}, but that will return
* ({@code Optional.empty()}) if this node cannot
* be coerced to {@code short}.
*
* @return {@link Optional<Short>} value this node represents,
* if possible to accurately represent; {@code Optional.empty()} otherwise
*/
public abstract Optional<Short> asShortOpt();

// // Scalar access: Numbers, Java int

/**
Expand Down Expand Up @@ -1082,6 +1102,16 @@ public String asText(String defaultValue) {
*/
public abstract float floatValue(float defaultValue);

/**
* Method similar to {@link #floatValue()}, but that will return empty
* {@link Optional<Float>} ({@code Optional.empty()}) if this node cannot
* be converted to Java {@code float}.
*
* @return Java {@code float} value this node represents, as {@link Optional<Float>},
* if possible to accurately represent; {@code Optional.empty()} otherwise
*/
public abstract Optional<Float> floatValueOpt();

/**
* Method similar to {@link #floatValue()} but in addition to coercing Number
* values will also try coerce couple of additional types:
Expand Down Expand Up @@ -1110,6 +1140,16 @@ public String asText(String defaultValue) {
*/
public abstract float asFloat(float defaultValue);

/**
* Method similar to {@link #asFloat()}, but that will return
* ({@code Optional.empty()}) if this node cannot
* be coerced to {@code float}.
*
* @return {@link Optional<Float>} value this node represents,
* if possible to accurately represent; {@code Optional.empty()} otherwise
*/
public abstract Optional<Float> asFloatOpt();

// // Scalar access: Numbers, Java double

/**
Expand Down
24 changes: 24 additions & 0 deletions src/main/java/tools/jackson/databind/node/BaseJsonNode.java
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,12 @@ public short shortValue(short defaultValue) {
return defaultValue;
}

@Override
public Optional<Short> shortValueOpt() {
// Overridden by NumericNode, for other types return default
return Optional.empty();
}

@Override
public short asShort() {
return _reportCoercionFail("asShort()", Short.TYPE, "value type not numeric");
Expand All @@ -87,6 +93,12 @@ public short asShort(short defaultValue) {
return defaultValue;
}

@Override
public Optional<Short> asShortOpt() {
// Overridden by NumericNode, for other types return default
return Optional.empty();
}

@Override
public int intValue() {
return _reportCoercionFail("intValue()", Integer.TYPE, "value type not numeric");
Expand Down Expand Up @@ -200,6 +212,12 @@ public float floatValue(float defaultValue) {
return defaultValue;
}

@Override
public Optional<Float> floatValueOpt() {
// Overridden by NumericNode, for other types return default
return Optional.empty();
}

@Override
public float asFloat() {
return _reportCoercionFail("asFloat()", Float.TYPE, "value type not numeric");
Expand All @@ -211,6 +229,12 @@ public float asFloat(float defaultValue) {
return defaultValue;
}

@Override
public Optional<Float> asFloatOpt() {
// Overridden by NumericNode, for other types return default
return Optional.empty();
}

@Override
public double doubleValue() {
return _reportCoercionFail("doubleValue()", Double.TYPE, "value type not numeric");
Expand Down
40 changes: 34 additions & 6 deletions src/main/java/tools/jackson/databind/node/BigIntegerNode.java
Original file line number Diff line number Diff line change
Expand Up @@ -70,27 +70,37 @@ public Number numberValue() {
@Override
public short shortValue() {
if (_inShortRange()) {
return (short) _value.intValue();
return _value.shortValue();
}
return _reportShortCoercionRangeFail("shortValue()");
}

@Override
public short shortValue(short defaultValue) {
return _inShortRange() ? (short) _value.intValue() : defaultValue;
return _inShortRange() ? _value.shortValue() : defaultValue;
}

@Override
public Optional<Short> shortValueOpt() {
return _inShortRange() ? Optional.of(_value.shortValue()) : Optional.empty();
}

@Override
public short asShort() {
if (_inShortRange()) {
return (short) _value.intValue();
return _value.shortValue();
}
return _reportShortCoercionRangeFail("asShort()");
}

@Override
public short asShort(short defaultValue) {
return _inShortRange() ? (short) _value.intValue() : defaultValue;
return _inShortRange() ? _value.shortValue() : defaultValue;
}

@Override
public Optional<Short> asShortOpt() {
return _inShortRange() ? Optional.of(_value.shortValue()) : Optional.empty();
}

@Override
Expand Down Expand Up @@ -193,6 +203,15 @@ public float floatValue(float defaultValue) {
return (Float.isFinite(f)) ? f : defaultValue;
}

@Override
public Optional<Float> floatValueOpt() {
float f = _asFloatValueUnchecked();
if (Float.isFinite(f)) {
return Optional.of(f);
}
return Optional.empty();
}

@Override
public float asFloat() {
float f = _asFloatValueUnchecked();
Expand All @@ -208,6 +227,15 @@ public float asFloat(float defaultValue) {
return (Float.isFinite(f)) ? f : defaultValue;
}

@Override
public Optional<Float> asFloatOpt() {
float f = _asFloatValueUnchecked();
if (Float.isFinite(f)) {
return Optional.of(f);
}
return Optional.empty();
}

@Override
public double doubleValue() {
double d = _asDoubleValueUnchecked();
Expand All @@ -227,7 +255,7 @@ public double doubleValue(double defaultValue) {
public OptionalDouble doubleValueOpt() {
double d = _asDoubleValueUnchecked();
if (Double.isFinite(d)) {
return OptionalDouble.of(_value.doubleValue());
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good catch!

return OptionalDouble.of(d);
}
return OptionalDouble.empty();
}
Expand All @@ -251,7 +279,7 @@ public double asDouble(double defaultValue) {
public OptionalDouble asDoubleOpt() {
double d = _asDoubleValueUnchecked();
if (Double.isFinite(d)) {
return OptionalDouble.of(_value.doubleValue());
return OptionalDouble.of(d);
}
return OptionalDouble.empty();
}
Expand Down
24 changes: 21 additions & 3 deletions src/main/java/tools/jackson/databind/node/DecimalNode.java
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,15 @@ public float floatValue(float defaultValue) {
return defaultValue;
}

@Override
public Optional<Float> floatValueOpt() {
float f = _value.floatValue();
if (Float.isFinite(f)) {
return Optional.of(f);
}
return Optional.empty();
}

@Override
public float asFloat() {
float f = _value.floatValue();
Expand All @@ -107,6 +116,15 @@ public float asFloat(float defaultValue) {
return defaultValue;
}

@Override
public Optional<Float> asFloatOpt() {
float f = _value.floatValue();
if (Float.isFinite(f)) {
return Optional.of(f);
}
return Optional.empty();
}

@Override
public double doubleValue() {
double d = _value.doubleValue();
Expand All @@ -129,7 +147,7 @@ public double doubleValue(double defaultValue) {
public OptionalDouble doubleValueOpt() {
double d = _value.doubleValue();
if (Double.isFinite(d)) {
return OptionalDouble.of(_value.doubleValue());
return OptionalDouble.of(d);
}
return OptionalDouble.empty();
}
Expand All @@ -156,7 +174,7 @@ public double asDouble(double defaultValue) {
public OptionalDouble asDoubleOpt() {
double d = _value.doubleValue();
if (Double.isFinite(d)) {
return OptionalDouble.of(_value.doubleValue());
return OptionalDouble.of(d);
}
return OptionalDouble.empty();
}
Expand Down Expand Up @@ -226,7 +244,7 @@ protected boolean _inShortRange() {

@Override
protected boolean _inIntRange() {
return _inLongRange() && (_value.compareTo(BD_MIN_INTEGER) >= 0) && (_value.compareTo(BD_MAX_INTEGER) <= 0);
return (_value.compareTo(BD_MIN_INTEGER) >= 0) && (_value.compareTo(BD_MAX_INTEGER) <= 0);
}

@Override
Expand Down
19 changes: 19 additions & 0 deletions src/main/java/tools/jackson/databind/node/DoubleNode.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Optional;
import java.util.OptionalDouble;

import tools.jackson.core.*;
Expand Down Expand Up @@ -86,6 +87,15 @@ public float floatValue(float defaultValue) {
return defaultValue;
}

@Override
public Optional<Float> floatValueOpt() {
float f = (float) _value;
if (Float.isFinite(f)) {
return Optional.of(f);
}
return Optional.empty();
}

@Override
public float asFloat() {
float f = (float) _value;
Expand All @@ -104,6 +114,15 @@ public float asFloat(float defaultValue) {
return defaultValue;
}

@Override
public Optional<Float> asFloatOpt() {
float f = (float) _value;
if (Float.isFinite(f)) {
return Optional.of(f);
}
return Optional.empty();
}

@Override
public double doubleValue() {
return _value;
Expand Down
11 changes: 11 additions & 0 deletions src/main/java/tools/jackson/databind/node/FloatNode.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Optional;
import java.util.OptionalDouble;

import tools.jackson.core.*;
Expand Down Expand Up @@ -72,6 +73,11 @@ public float floatValue(float defaultValue) {
return _value;
}

@Override
public Optional<Float> floatValueOpt() {
return Optional.of(_value);
}

@Override
public float asFloat() {
return _value;
Expand All @@ -82,6 +88,11 @@ public float asFloat(float defaultValue) {
return _value;
}

@Override
public Optional<Float> asFloatOpt() {
return Optional.of(_value);
}

@Override
public double doubleValue() {
return _value;
Expand Down
11 changes: 10 additions & 1 deletion src/main/java/tools/jackson/databind/node/IntNode.java
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,11 @@ public short shortValue(short defaultValue) {
return _inShortRange() ? (short) _value : defaultValue;
}

@Override
public Optional<Short> shortValueOpt() {
return _inShortRange() ? Optional.of((short) _value) : Optional.empty();
}

@Override
public short asShort() {
if (_inShortRange()) {
Expand All @@ -108,6 +113,11 @@ public short asShort(short defaultValue) {
return _inShortRange() ? (short) _value : defaultValue;
}

@Override
public Optional<Short> asShortOpt() {
return _inShortRange() ? Optional.of((short) _value) : Optional.empty();
}

@Override
public int intValue() { return _value; }

Expand All @@ -132,7 +142,6 @@ public int asInt(int defaultValue) {
@Override
public OptionalInt asIntOpt() {
return OptionalInt.of(_value);

}

@Override
Expand Down
10 changes: 10 additions & 0 deletions src/main/java/tools/jackson/databind/node/LongNode.java
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,11 @@ public short shortValue(short defaultValue) {
return _inShortRange() ? (short) _value : defaultValue;
}

@Override
public Optional<Short> shortValueOpt() {
return _inShortRange() ? Optional.of((short) _value) : Optional.empty();
}

@Override
public short asShort() {
if (_inShortRange()) {
Expand All @@ -88,6 +93,11 @@ public short asShort(short defaultValue) {
return _inShortRange() ? (short) _value : defaultValue;
}

@Override
public Optional<Short> asShortOpt() {
return _inShortRange() ? Optional.of((short) _value) : Optional.empty();
}

@Override
public int intValue() {
if (_inIntRange()) {
Expand Down
Loading