41
41
import com .google .common .collect .Sets ;
42
42
43
43
import org .apiguardian .api .API ;
44
+ import org .checkerframework .checker .nullness .qual .NonNull ;
45
+ import org .checkerframework .checker .nullness .qual .Nullable ;
46
+ import org .checkerframework .framework .qual .DefaultQualifier ;
47
+ import org .checkerframework .framework .qual .TypeUseLocation ;
44
48
45
49
import java .math .BigDecimal ;
46
50
import java .util .AbstractList ;
70
74
/**
71
75
* Default implementations of methods in the {@link Enumerable} interface.
72
76
*/
77
+ @ DefaultQualifier (
78
+ value = Nullable .class ,
79
+ locations = TypeUseLocation .UPPER_BOUND
80
+ )
81
+ @ DefaultQualifier (
82
+ value = Nullable .class ,
83
+ locations = TypeUseLocation .LOWER_BOUND
84
+ )
73
85
public abstract class EnumerableDefaults {
74
86
75
87
/**
@@ -625,7 +637,7 @@ public static <TSource> TSource first(Enumerable<TSource> enumerable,
625
637
* Returns the first element of a sequence, or a
626
638
* default value if the sequence contains no elements.
627
639
*/
628
- public static <TSource > TSource firstOrDefault (
640
+ public static <@ Nullable TSource > TSource firstOrDefault (
629
641
Enumerable <TSource > enumerable ) {
630
642
try (Enumerator <TSource > os = enumerable .enumerator ()) {
631
643
if (os .moveNext ()) {
@@ -640,7 +652,7 @@ public static <TSource> TSource firstOrDefault(
640
652
* satisfies a condition or a default value if no such element is
641
653
* found.
642
654
*/
643
- public static <TSource > TSource firstOrDefault (Enumerable <TSource > enumerable ,
655
+ public static <@ Nullable TSource > TSource firstOrDefault (Enumerable <TSource > enumerable ,
644
656
Predicate1 <TSource > predicate ) {
645
657
for (TSource o : enumerable ) {
646
658
if (predicate .apply (o )) {
@@ -1225,7 +1237,7 @@ public static <TSource, TInner, TKey, TResult> Enumerable<TResult> hashJoin(
1225
1237
Function1 <TSource , TKey > outerKeySelector ,
1226
1238
Function1 <TInner , TKey > innerKeySelector ,
1227
1239
Function2 <TSource , TInner , TResult > resultSelector ,
1228
- EqualityComparer <TKey > comparer , boolean generateNullsOnLeft ,
1240
+ @ Nullable EqualityComparer <TKey > comparer , boolean generateNullsOnLeft ,
1229
1241
boolean generateNullsOnRight ) {
1230
1242
return hashEquiJoin_ (
1231
1243
outer ,
@@ -1248,7 +1260,7 @@ public static <TSource, TInner, TKey, TResult> Enumerable<TResult> hashJoin(
1248
1260
Function1 <TSource , TKey > outerKeySelector ,
1249
1261
Function1 <TInner , TKey > innerKeySelector ,
1250
1262
Function2 <TSource , TInner , TResult > resultSelector ,
1251
- EqualityComparer <TKey > comparer , boolean generateNullsOnLeft ,
1263
+ @ Nullable EqualityComparer <TKey > comparer , boolean generateNullsOnLeft ,
1252
1264
boolean generateNullsOnRight ,
1253
1265
Predicate2 <TSource , TInner > predicate ) {
1254
1266
if (predicate == null ) {
@@ -1293,7 +1305,7 @@ public Enumerator<TResult> enumerator() {
1293
1305
return new Enumerator <TResult >() {
1294
1306
Enumerator <TSource > outers = outer .enumerator ();
1295
1307
Enumerator <TInner > inners = Linq4j .emptyEnumerator ();
1296
- Set <TKey > unmatchedKeys =
1308
+ @ Nullable Set <TKey > unmatchedKeys =
1297
1309
generateNullsOnLeft
1298
1310
? new HashSet <>(innerLookup .keySet ())
1299
1311
: null ;
@@ -1397,7 +1409,7 @@ public Enumerator<TResult> enumerator() {
1397
1409
return new Enumerator <TResult >() {
1398
1410
Enumerator <TSource > outers = outer .enumerator ();
1399
1411
Enumerator <TInner > inners = Linq4j .emptyEnumerator ();
1400
- List <TInner > innersUnmatched =
1412
+ @ Nullable List <TInner > innersUnmatched =
1401
1413
generateNullsOnLeft
1402
1414
? new ArrayList <>(innerToLookUp .toList ())
1403
1415
: null ;
@@ -1491,10 +1503,10 @@ public static <TSource, TInner, TResult> Enumerable<TResult> correlateJoin(
1491
1503
return new AbstractEnumerable <TResult >() {
1492
1504
public Enumerator <TResult > enumerator () {
1493
1505
return new Enumerator <TResult >() {
1494
- private Enumerator <TSource > outerEnumerator = outer .enumerator ();
1495
- private Enumerator <TInner > innerEnumerator ;
1496
- TSource outerValue ;
1497
- TInner innerValue ;
1506
+ private final Enumerator <TSource > outerEnumerator = outer .enumerator ();
1507
+ private @ Nullable Enumerator <TInner > innerEnumerator ;
1508
+ @ Nullable TSource outerValue ;
1509
+ @ Nullable TInner innerValue ;
1498
1510
int state = 0 ; // 0 -- moving outer, 1 moving inner;
1499
1511
1500
1512
public TResult current () {
@@ -1629,19 +1641,19 @@ public static <TSource, TInner, TResult> Enumerable<TResult> correlateBatchJoin(
1629
1641
final JoinType joinType ,
1630
1642
final Enumerable <TSource > outer ,
1631
1643
final Function1 <List <TSource >, Enumerable <TInner >> inner ,
1632
- final Function2 <TSource , TInner , TResult > resultSelector ,
1633
- final Predicate2 <TSource , TInner > predicate ,
1644
+ final Function2 <@ Nullable TSource , @ Nullable TInner , @ Nullable TResult > resultSelector ,
1645
+ final Predicate2 <@ Nullable TSource , @ Nullable TInner > predicate ,
1634
1646
final int batchSize ) {
1635
1647
return new AbstractEnumerable <TResult >() {
1636
1648
@ Override public Enumerator <TResult > enumerator () {
1637
1649
return new Enumerator <TResult >() {
1638
- Enumerator <TSource > outerEnumerator = outer .enumerator ();
1639
- List <TSource > outerValues = new ArrayList <>(batchSize );
1640
- List <TInner > innerValues = new ArrayList <>();
1641
- TSource outerValue ;
1642
- TInner innerValue ;
1643
- Enumerable <TInner > innerEnumerable ;
1644
- Enumerator <TInner > innerEnumerator ;
1650
+ final Enumerator <TSource > outerEnumerator = outer .enumerator ();
1651
+ final List <TSource > outerValues = new ArrayList <>(batchSize );
1652
+ final List <TInner > innerValues = new ArrayList <>();
1653
+ @ Nullable TSource outerValue ;
1654
+ @ Nullable TInner innerValue ;
1655
+ @ Nullable Enumerable <TInner > innerEnumerable ;
1656
+ @ Nullable Enumerator <TInner > innerEnumerator ;
1645
1657
boolean innerEnumHasNext = false ;
1646
1658
boolean atLeastOneResult = false ;
1647
1659
int i = -1 ; // outer position
@@ -1875,7 +1887,7 @@ public Enumerator<TSource> enumerator() {
1875
1887
// moment when we are sure
1876
1888
// that it will be really needed, i.e. when the first outer
1877
1889
// enumerator item is processed
1878
- final Supplier <Lookup <TKey , TInner >> innerLookup = Suppliers .memoize (
1890
+ final Supplier <Lookup <TKey , @ NonNull TInner >> innerLookup = Suppliers .memoize (
1879
1891
() ->
1880
1892
comparer == null
1881
1893
? inner .toLookup (innerKeySelector )
@@ -1911,7 +1923,7 @@ private static <TSource, TInner, TKey> Enumerable<TSource> semiEquiJoin_(
1911
1923
final Enumerable <TSource > outer , final Enumerable <TInner > inner ,
1912
1924
final Function1 <TSource , TKey > outerKeySelector ,
1913
1925
final Function1 <TInner , TKey > innerKeySelector ,
1914
- final EqualityComparer <TKey > comparer ,
1926
+ final @ Nullable EqualityComparer <TKey > comparer ,
1915
1927
final boolean anti ) {
1916
1928
return new AbstractEnumerable <TSource >() {
1917
1929
public Enumerator <TSource > enumerator () {
0 commit comments