Advertisement
Guest User

Untitled

a guest
Jan 16th, 2019
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 2.96 KB | None | 0 0
  1. package splititerator;
  2.  
  3. import java.util.List;
  4. import java.util.Optional;
  5. import java.util.function.Function;
  6. import java.util.stream.Collectors;
  7. import java.util.stream.IntStream;
  8. import java.util.stream.Stream;
  9.  
  10. public class SplitIteratorFactoryImpl implements SplitIteratorFactory {
  11.    
  12.     private class SimpleSplitIterator<X> implements SplitIterator<X>{
  13.        
  14.         private List<X> datas;
  15.        
  16.         //Package-protected
  17.         SimpleSplitIterator(Stream<X> source) {
  18.             this.datas = source.collect(Collectors.toList());
  19.         }
  20.        
  21.         protected List<X> getDatas(){
  22.             return this.datas;
  23.         }
  24.        
  25.         protected void setDatas(List<X> datas) {
  26.             this.datas = datas;
  27.         }
  28.        
  29.         @Override
  30.         public Optional<X> next() {
  31.             return Optional.ofNullable(this.datas.size() == 0 ? null : this.datas.remove(0));
  32.         }
  33.  
  34.         @Override
  35.         public SplitIterator<X> split() {
  36.             throw new UnsupportedOperationException();
  37.         }
  38.     }
  39.    
  40.     private class SplitIteratorImpl<X> extends SimpleSplitIterator<X> {
  41.  
  42.         //Package-protected
  43.         SplitIteratorImpl(Stream<X> source) {
  44.             super(source);
  45.         }
  46.        
  47.         @Override
  48.         public SplitIterator<X> split() {
  49.             List<X> splittedData = getDatas().subList(0, getDatas().size() / 2);
  50.             setDatas(getDatas().subList(getDatas().size() / 2, getDatas().size()));
  51.             return new SplitIteratorImpl<X>(splittedData.stream());
  52.         }
  53.     }
  54.  
  55.     @Override
  56.     public SplitIterator<Integer> fromRange(int start, int stop) {
  57.         return new SplitIteratorImpl<Integer>(IntStream.range(start, stop+1).mapToObj(i -> i));
  58.     }
  59.  
  60.     @Override
  61.     public SplitIterator<Integer> fromRangeNonSplit(int start, int stop) {
  62.         return new SimpleSplitIterator<Integer>(IntStream.range(start, stop+1).mapToObj(i -> i));
  63.     }
  64.  
  65.     @Override
  66.     public <X> SplitIterator<X> fromList(List<X> list) {
  67.         return new SplitIteratorImpl<>(list.stream());
  68.     }
  69.  
  70.     @Override
  71.     public <X> SplitIterator<X> fromListNonSplit(List<X> list) {
  72.         return new SimpleSplitIterator<>(list.stream());
  73.     }
  74.  
  75.     @Override
  76.     public <X> SplitIterator<X> ignoreFirst(SplitIterator<X> source) {
  77.         if(source instanceof SimpleSplitIterator) {
  78.             SimpleSplitIterator<X> it = (SimpleSplitIterator<X>)source;
  79.             Stream<X> newSource = it.getDatas().stream().skip(1);
  80.             SimpleSplitIterator<X> res;
  81.             if(source instanceof SplitIteratorImpl) {
  82.                 res = new SplitIteratorImpl<>(newSource);
  83.             } else {
  84.                 res = new SimpleSplitIterator<>(newSource);
  85.             }
  86.             return res;
  87.         }
  88.        
  89.         throw new UnsupportedOperationException();
  90.     }
  91.  
  92.     @Override
  93.     public <X, Y> SplitIterator<Y> map(SplitIterator<X> source, Function<X, Y> mapOp) {
  94.         if(source instanceof SimpleSplitIterator) {
  95.             SimpleSplitIterator<X> it = (SimpleSplitIterator<X>)source;
  96.             Stream<Y> newSource = it.getDatas().stream().map(mapOp);
  97.             SimpleSplitIterator<Y> res;
  98.             if(source instanceof SplitIteratorImpl) {
  99.                 res = new SplitIteratorImpl<>(newSource);
  100.             } else {
  101.                 res = new SimpleSplitIterator<>(newSource);
  102.             }
  103.             return res;
  104.         }
  105.        
  106.         throw new UnsupportedOperationException();
  107.     }
  108.  
  109. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement