View Javadoc
1   package org.davidmoten.kool.internal.operators.stream;
2   
3   import java.util.Optional;
4   
5   import org.davidmoten.kool.Maybe;
6   import org.davidmoten.kool.StreamIterable;
7   import org.davidmoten.kool.StreamIterator;
8   import org.davidmoten.kool.function.BiFunction;
9   
10  import com.github.davidmoten.guavamini.Preconditions;
11  
12  public final class ReduceNoInitialValue<T> implements Maybe<T> {
13  
14      private final BiFunction<? super T, ? super T, ? extends T> reducer;
15      private final StreamIterable<T> source;
16  
17      public ReduceNoInitialValue(BiFunction<? super T, ? super T, ? extends T> reducer, StreamIterable<T> source) {
18          this.reducer = reducer;
19          this.source = source;
20      }
21  
22      @Override
23      public Optional<T> get() {
24          StreamIterator<T> it = source.iteratorNullChecked();
25          T a, b;
26          if (it.hasNext()) {
27              a = it.nextNullChecked();
28          } else {
29              return Optional.empty();
30          }
31          if (it.hasNext()) {
32              b = it.nextNullChecked();
33          } else {
34              return Optional.empty();
35          }
36          T v = reducer.applyUnchecked(a, b);
37          while (it.hasNext()) {
38              v = Preconditions.checkNotNull(reducer.applyUnchecked(v, it.nextNullChecked()));
39          }
40          return Optional.of(v);
41      }
42  
43  }