Skip to content

Commit 0d89834

Browse files
hannyucowtowncoder
andauthored
feat: Add "optional" variants -- shortValueOpt(), etc. (#5158)
Co-authored-by: Tatu Saloranta <tatu.saloranta@iki.fi>
1 parent a656f24 commit 0d89834

17 files changed

+287
-11
lines changed

src/main/java/tools/jackson/databind/JsonNode.java

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -754,6 +754,16 @@ public String asText(String defaultValue) {
754754
*/
755755
public abstract short shortValue(short defaultValue);
756756

757+
/**
758+
* Method similar to {@link #shortValue()}, but that will return empty
759+
* {@link Optional<Short>} ({@code Optional.empty()}) if this node cannot
760+
* be converted to Java {@code short}.
761+
*
762+
* @return Java {@code short} value this node represents, as {@link Optional<Short>},
763+
* if possible to accurately represent; {@code Optional.empty()} otherwise
764+
*/
765+
public abstract Optional<Short> shortValueOpt();
766+
757767
/**
758768
* Method similar to {@link #shortValue()} but in addition to coercing Number
759769
* values (same as {@link #shortValue()}), will also try to coerce a
@@ -788,6 +798,16 @@ public String asText(String defaultValue) {
788798
*/
789799
public abstract short asShort(short defaultValue);
790800

801+
/**
802+
* Method similar to {@link #asShort()}, but that will return
803+
* ({@code Optional.empty()}) if this node cannot
804+
* be coerced to {@code short}.
805+
*
806+
* @return {@link Optional<Short>} value this node represents,
807+
* if possible to accurately represent; {@code Optional.empty()} otherwise
808+
*/
809+
public abstract Optional<Short> asShortOpt();
810+
791811
// // Scalar access: Numbers, Java int
792812

793813
/**
@@ -1082,6 +1102,16 @@ public String asText(String defaultValue) {
10821102
*/
10831103
public abstract float floatValue(float defaultValue);
10841104

1105+
/**
1106+
* Method similar to {@link #floatValue()}, but that will return empty
1107+
* {@link Optional<Float>} ({@code Optional.empty()}) if this node cannot
1108+
* be converted to Java {@code float}.
1109+
*
1110+
* @return Java {@code float} value this node represents, as {@link Optional<Float>},
1111+
* if possible to accurately represent; {@code Optional.empty()} otherwise
1112+
*/
1113+
public abstract Optional<Float> floatValueOpt();
1114+
10851115
/**
10861116
* Method similar to {@link #floatValue()} but in addition to coercing Number
10871117
* values will also try coerce couple of additional types:
@@ -1110,6 +1140,16 @@ public String asText(String defaultValue) {
11101140
*/
11111141
public abstract float asFloat(float defaultValue);
11121142

1143+
/**
1144+
* Method similar to {@link #asFloat()}, but that will return
1145+
* ({@code Optional.empty()}) if this node cannot
1146+
* be coerced to {@code float}.
1147+
*
1148+
* @return {@link Optional<Float>} value this node represents,
1149+
* if possible to accurately represent; {@code Optional.empty()} otherwise
1150+
*/
1151+
public abstract Optional<Float> asFloatOpt();
1152+
11131153
// // Scalar access: Numbers, Java double
11141154

11151155
/**

src/main/java/tools/jackson/databind/node/BaseJsonNode.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,12 @@ public short shortValue(short defaultValue) {
7676
return defaultValue;
7777
}
7878

79+
@Override
80+
public Optional<Short> shortValueOpt() {
81+
// Overridden by NumericNode, for other types return default
82+
return Optional.empty();
83+
}
84+
7985
@Override
8086
public short asShort() {
8187
return _reportCoercionFail("asShort()", Short.TYPE, "value type not numeric");
@@ -87,6 +93,12 @@ public short asShort(short defaultValue) {
8793
return defaultValue;
8894
}
8995

96+
@Override
97+
public Optional<Short> asShortOpt() {
98+
// Overridden by NumericNode, for other types return default
99+
return Optional.empty();
100+
}
101+
90102
@Override
91103
public int intValue() {
92104
return _reportCoercionFail("intValue()", Integer.TYPE, "value type not numeric");
@@ -200,6 +212,12 @@ public float floatValue(float defaultValue) {
200212
return defaultValue;
201213
}
202214

215+
@Override
216+
public Optional<Float> floatValueOpt() {
217+
// Overridden by NumericNode, for other types return default
218+
return Optional.empty();
219+
}
220+
203221
@Override
204222
public float asFloat() {
205223
return _reportCoercionFail("asFloat()", Float.TYPE, "value type not numeric");
@@ -211,6 +229,12 @@ public float asFloat(float defaultValue) {
211229
return defaultValue;
212230
}
213231

232+
@Override
233+
public Optional<Float> asFloatOpt() {
234+
// Overridden by NumericNode, for other types return default
235+
return Optional.empty();
236+
}
237+
214238
@Override
215239
public double doubleValue() {
216240
return _reportCoercionFail("doubleValue()", Double.TYPE, "value type not numeric");

src/main/java/tools/jackson/databind/node/BigIntegerNode.java

Lines changed: 34 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -70,27 +70,37 @@ public Number numberValue() {
7070
@Override
7171
public short shortValue() {
7272
if (_inShortRange()) {
73-
return (short) _value.intValue();
73+
return _value.shortValue();
7474
}
7575
return _reportShortCoercionRangeFail("shortValue()");
7676
}
7777

7878
@Override
7979
public short shortValue(short defaultValue) {
80-
return _inShortRange() ? (short) _value.intValue() : defaultValue;
80+
return _inShortRange() ? _value.shortValue() : defaultValue;
81+
}
82+
83+
@Override
84+
public Optional<Short> shortValueOpt() {
85+
return _inShortRange() ? Optional.of(_value.shortValue()) : Optional.empty();
8186
}
8287

8388
@Override
8489
public short asShort() {
8590
if (_inShortRange()) {
86-
return (short) _value.intValue();
91+
return _value.shortValue();
8792
}
8893
return _reportShortCoercionRangeFail("asShort()");
8994
}
9095

9196
@Override
9297
public short asShort(short defaultValue) {
93-
return _inShortRange() ? (short) _value.intValue() : defaultValue;
98+
return _inShortRange() ? _value.shortValue() : defaultValue;
99+
}
100+
101+
@Override
102+
public Optional<Short> asShortOpt() {
103+
return _inShortRange() ? Optional.of(_value.shortValue()) : Optional.empty();
94104
}
95105

96106
@Override
@@ -193,6 +203,15 @@ public float floatValue(float defaultValue) {
193203
return (Float.isFinite(f)) ? f : defaultValue;
194204
}
195205

206+
@Override
207+
public Optional<Float> floatValueOpt() {
208+
float f = _asFloatValueUnchecked();
209+
if (Float.isFinite(f)) {
210+
return Optional.of(f);
211+
}
212+
return Optional.empty();
213+
}
214+
196215
@Override
197216
public float asFloat() {
198217
float f = _asFloatValueUnchecked();
@@ -208,6 +227,15 @@ public float asFloat(float defaultValue) {
208227
return (Float.isFinite(f)) ? f : defaultValue;
209228
}
210229

230+
@Override
231+
public Optional<Float> asFloatOpt() {
232+
float f = _asFloatValueUnchecked();
233+
if (Float.isFinite(f)) {
234+
return Optional.of(f);
235+
}
236+
return Optional.empty();
237+
}
238+
211239
@Override
212240
public double doubleValue() {
213241
double d = _asDoubleValueUnchecked();
@@ -227,7 +255,7 @@ public double doubleValue(double defaultValue) {
227255
public OptionalDouble doubleValueOpt() {
228256
double d = _asDoubleValueUnchecked();
229257
if (Double.isFinite(d)) {
230-
return OptionalDouble.of(_value.doubleValue());
258+
return OptionalDouble.of(d);
231259
}
232260
return OptionalDouble.empty();
233261
}
@@ -251,7 +279,7 @@ public double asDouble(double defaultValue) {
251279
public OptionalDouble asDoubleOpt() {
252280
double d = _asDoubleValueUnchecked();
253281
if (Double.isFinite(d)) {
254-
return OptionalDouble.of(_value.doubleValue());
282+
return OptionalDouble.of(d);
255283
}
256284
return OptionalDouble.empty();
257285
}

src/main/java/tools/jackson/databind/node/DecimalNode.java

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,15 @@ public float floatValue(float defaultValue) {
8989
return defaultValue;
9090
}
9191

92+
@Override
93+
public Optional<Float> floatValueOpt() {
94+
float f = _value.floatValue();
95+
if (Float.isFinite(f)) {
96+
return Optional.of(f);
97+
}
98+
return Optional.empty();
99+
}
100+
92101
@Override
93102
public float asFloat() {
94103
float f = _value.floatValue();
@@ -107,6 +116,15 @@ public float asFloat(float defaultValue) {
107116
return defaultValue;
108117
}
109118

119+
@Override
120+
public Optional<Float> asFloatOpt() {
121+
float f = _value.floatValue();
122+
if (Float.isFinite(f)) {
123+
return Optional.of(f);
124+
}
125+
return Optional.empty();
126+
}
127+
110128
@Override
111129
public double doubleValue() {
112130
double d = _value.doubleValue();
@@ -129,7 +147,7 @@ public double doubleValue(double defaultValue) {
129147
public OptionalDouble doubleValueOpt() {
130148
double d = _value.doubleValue();
131149
if (Double.isFinite(d)) {
132-
return OptionalDouble.of(_value.doubleValue());
150+
return OptionalDouble.of(d);
133151
}
134152
return OptionalDouble.empty();
135153
}
@@ -156,7 +174,7 @@ public double asDouble(double defaultValue) {
156174
public OptionalDouble asDoubleOpt() {
157175
double d = _value.doubleValue();
158176
if (Double.isFinite(d)) {
159-
return OptionalDouble.of(_value.doubleValue());
177+
return OptionalDouble.of(d);
160178
}
161179
return OptionalDouble.empty();
162180
}
@@ -226,7 +244,7 @@ protected boolean _inShortRange() {
226244

227245
@Override
228246
protected boolean _inIntRange() {
229-
return _inLongRange() && (_value.compareTo(BD_MIN_INTEGER) >= 0) && (_value.compareTo(BD_MAX_INTEGER) <= 0);
247+
return (_value.compareTo(BD_MIN_INTEGER) >= 0) && (_value.compareTo(BD_MAX_INTEGER) <= 0);
230248
}
231249

232250
@Override

src/main/java/tools/jackson/databind/node/DoubleNode.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import java.math.BigDecimal;
44
import java.math.BigInteger;
5+
import java.util.Optional;
56
import java.util.OptionalDouble;
67

78
import tools.jackson.core.*;
@@ -86,6 +87,15 @@ public float floatValue(float defaultValue) {
8687
return defaultValue;
8788
}
8889

90+
@Override
91+
public Optional<Float> floatValueOpt() {
92+
float f = (float) _value;
93+
if (Float.isFinite(f)) {
94+
return Optional.of(f);
95+
}
96+
return Optional.empty();
97+
}
98+
8999
@Override
90100
public float asFloat() {
91101
float f = (float) _value;
@@ -104,6 +114,15 @@ public float asFloat(float defaultValue) {
104114
return defaultValue;
105115
}
106116

117+
@Override
118+
public Optional<Float> asFloatOpt() {
119+
float f = (float) _value;
120+
if (Float.isFinite(f)) {
121+
return Optional.of(f);
122+
}
123+
return Optional.empty();
124+
}
125+
107126
@Override
108127
public double doubleValue() {
109128
return _value;

src/main/java/tools/jackson/databind/node/FloatNode.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import java.math.BigDecimal;
44
import java.math.BigInteger;
5+
import java.util.Optional;
56
import java.util.OptionalDouble;
67

78
import tools.jackson.core.*;
@@ -72,6 +73,11 @@ public float floatValue(float defaultValue) {
7273
return _value;
7374
}
7475

76+
@Override
77+
public Optional<Float> floatValueOpt() {
78+
return Optional.of(_value);
79+
}
80+
7581
@Override
7682
public float asFloat() {
7783
return _value;
@@ -82,6 +88,11 @@ public float asFloat(float defaultValue) {
8288
return _value;
8389
}
8490

91+
@Override
92+
public Optional<Float> asFloatOpt() {
93+
return Optional.of(_value);
94+
}
95+
8596
@Override
8697
public double doubleValue() {
8798
return _value;

src/main/java/tools/jackson/databind/node/IntNode.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,11 @@ public short shortValue(short defaultValue) {
9595
return _inShortRange() ? (short) _value : defaultValue;
9696
}
9797

98+
@Override
99+
public Optional<Short> shortValueOpt() {
100+
return _inShortRange() ? Optional.of((short) _value) : Optional.empty();
101+
}
102+
98103
@Override
99104
public short asShort() {
100105
if (_inShortRange()) {
@@ -108,6 +113,11 @@ public short asShort(short defaultValue) {
108113
return _inShortRange() ? (short) _value : defaultValue;
109114
}
110115

116+
@Override
117+
public Optional<Short> asShortOpt() {
118+
return _inShortRange() ? Optional.of((short) _value) : Optional.empty();
119+
}
120+
111121
@Override
112122
public int intValue() { return _value; }
113123

@@ -132,7 +142,6 @@ public int asInt(int defaultValue) {
132142
@Override
133143
public OptionalInt asIntOpt() {
134144
return OptionalInt.of(_value);
135-
136145
}
137146

138147
@Override

src/main/java/tools/jackson/databind/node/LongNode.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,11 @@ public short shortValue(short defaultValue) {
7575
return _inShortRange() ? (short) _value : defaultValue;
7676
}
7777

78+
@Override
79+
public Optional<Short> shortValueOpt() {
80+
return _inShortRange() ? Optional.of((short) _value) : Optional.empty();
81+
}
82+
7883
@Override
7984
public short asShort() {
8085
if (_inShortRange()) {
@@ -88,6 +93,11 @@ public short asShort(short defaultValue) {
8893
return _inShortRange() ? (short) _value : defaultValue;
8994
}
9095

96+
@Override
97+
public Optional<Short> asShortOpt() {
98+
return _inShortRange() ? Optional.of((short) _value) : Optional.empty();
99+
}
100+
91101
@Override
92102
public int intValue() {
93103
if (_inIntRange()) {

0 commit comments

Comments
 (0)