Bläddra i källkod

new: IteratorUtils#at
new: ListUtils#at
new: CQuery#at
new: IElements#at

Ranides Atterwim 6 år sedan
förälder
incheckning
9486d323ca

+ 14 - 4
assira/src/main/java/net/ranides/assira/collection/iterators/IntIteratorUtils.java

@@ -6,10 +6,7 @@
  */
 package net.ranides.assira.collection.iterators;
 
-import java.util.Iterator;
-import java.util.ListIterator;
-import java.util.NoSuchElementException;
-import java.util.Spliterator;
+import java.util.*;
 import java.util.function.Consumer;
 import java.util.function.IntConsumer;
 import java.util.function.IntFunction;
@@ -67,6 +64,19 @@ public final class IntIteratorUtils {
 		}
         return result;
     }
+
+    public static int at(IntIterator iterator, int index) {
+        for(int i=0; i<index; i++) {
+            if(!iterator.hasNext()) {
+                throw new IndexOutOfBoundsException(""+index);
+            }
+            iterator.nextInt();
+        }
+        if(!iterator.hasNext()) {
+            throw new IndexOutOfBoundsException(""+index);
+        }
+        return iterator.nextInt();
+    }
     
     public static int size(IntIterator iterator) {
 		if(iterator==null) {

+ 10 - 0
assira/src/main/java/net/ranides/assira/collection/iterators/IteratorUtils.java

@@ -52,6 +52,16 @@ public final class IteratorUtils {
         }
         return Optional.of(result);
     }
+
+    public static <T> Optional<T> at(Iterator<T> iterator, int index) {
+        for(int i=0; i<index; i++) {
+            if(!iterator.hasNext()) {
+                return Optional.empty();
+            }
+            iterator.next();
+        }
+        return iterator.hasNext() ? Optional.of(iterator.next()) : Optional.empty();
+    }
     
     public static <T> Optional<T> last(Iterator<T> iterator, Predicate<? super T> predicate) {
         boolean found = false;

+ 7 - 0
assira/src/main/java/net/ranides/assira/collection/lists/ListUtils.java

@@ -31,6 +31,13 @@ public final class ListUtils {
 	private ListUtils() {
 		/* utility class */
 	}
+
+	public static <T> Optional<T> at(List<T> values, int index) {
+		if(values.size() <= index) {
+			return Optional.empty();
+		}
+		return Optional.of(values.get(index));
+	}
 	
 	public static <T> Optional<T> first(List<T> values) {
 		if(values.isEmpty()) {

+ 3 - 1
assira/src/main/java/net/ranides/assira/collection/query/CQuery.java

@@ -74,7 +74,9 @@ public interface CQuery<T> extends Iterable<T> {
     Optional<T> first();
 
     Optional<T> last();
-    
+
+    Optional<T> at(int index);
+
     CQuery<T> distinct();
     
     CQuery<T> distinct(HashFunction<T> eq);

+ 17 - 0
assira/src/main/java/net/ranides/assira/collection/query/CQueryAbstract.java

@@ -146,6 +146,11 @@ public abstract class CQueryAbstract<T> implements CQuery<T> {
         return IteratorUtils.last(iterator());
     }
 
+    @Override
+    public Optional<T> at(int index) {
+        return IteratorUtils.at(iterator(), index);
+    }
+
     @Override
     public final CQuery<T> distinct() {
         return new CQCollection<>(() -> new HashSet<>(iterator()));
@@ -231,6 +236,12 @@ public abstract class CQueryAbstract<T> implements CQuery<T> {
             return source.get().stream();
         }
 
+        @Override
+        public final Optional<T> at(int index) {
+            Collection<T> c = source.get();
+            return c instanceof List ? ListUtils.at((List<T>)c, index) : super.at(index);
+        }
+
         @Override
         public final Optional<T> last() {
             Collection<T> c = source.get();
@@ -301,6 +312,12 @@ public abstract class CQueryAbstract<T> implements CQuery<T> {
             return new CQArray<>(source, offset+n, limit);
         }
 
+        @Override
+        public Optional<T> at(int index) {
+            T[] array = source.get();
+            return array.length > index ? Optional.of(array[index]) : Optional.empty();
+        }
+
         @Override
         public final Optional<T> last() {
             T[] array = source.get();

+ 2 - 0
assira/src/main/java/net/ranides/assira/reflection/IElements.java

@@ -36,6 +36,8 @@ public interface IElements<T> extends Iterable<T> {
     <R, A> R collect(Collector<? super T, A, R> collector);
 
     Optional<T> first();
+
+    Optional<T> at(int index);
     
     List<String> names();
     

+ 5 - 0
assira/src/main/java/net/ranides/assira/reflection/impl/AElements.java

@@ -85,6 +85,11 @@ public abstract class AElements<T> implements IElements<T> {
         return cquery.first();
     }
 
+    @Override
+    public Optional<T> at(int index) {
+        return cquery.at(index);
+    }
+
     @Override
     public IElements<T> hint(IHints hints) {
         this.hints.replace(hints);

+ 13 - 0
assira/src/test/java/net/ranides/assira/collection/iterators/IntIteratorUtilsTest.java

@@ -36,6 +36,19 @@ public class IntIteratorUtilsTest {
 			IntIteratorUtils.first(IntArrays.asList().iterator());
 		});
 	}
+
+    @Test
+    public void testAt() {
+        assertEquals(1, IntIteratorUtils.at(IntArrays.asList(1,2,3,4).iterator(), 0));
+        assertEquals(2, IntIteratorUtils.at(IntArrays.asList(1,2,3,4).iterator(), 1));
+        assertEquals(3, IntIteratorUtils.at(IntArrays.asList(1,2,3,4).iterator(), 2));
+        assertEquals(4, IntIteratorUtils.at(IntArrays.asList(1,2,3,4).iterator(), 3));
+        assertEquals(1, IntIteratorUtils.at(IntArrays.asList(1,2,3,4).iterator(), 0));
+
+        assertThrows(IndexOutOfBoundsException.class, () -> {
+            IntIteratorUtils.at(IntArrays.asList(1,2).iterator(), 5);
+        });
+    }
 	
 	@Test
 	public void testLast() {

+ 13 - 1
assira/src/test/java/net/ranides/assira/collection/iterators/IteratorUtilsTest.java

@@ -48,7 +48,19 @@ public class IteratorUtilsTest {
 			IteratorUtils.last(Arrays.asList().iterator()).get();
 		});
 	}
-	
+
+    @Test
+    public void testAt() {
+        assertEquals((Integer)1, IteratorUtils.at(Arrays.asList(1,2,3,4).iterator(), 0).get());
+        assertEquals((Integer)2, IteratorUtils.at(Arrays.asList(1,2,3,4).iterator(), 1).get());
+        assertEquals((Integer)3, IteratorUtils.at(Arrays.asList(1,2,3,4).iterator(), 2).get());
+        assertEquals((Integer)4, IteratorUtils.at(Arrays.asList(1,2,3,4).iterator(), 3).get());
+        assertEquals((Integer)1, IteratorUtils.at(Arrays.asList(1,2,3,4).iterator(), 0).get());
+
+        assertThrows(NoSuchElementException.class, () -> {
+            IteratorUtils.at(Arrays.asList(1,2).iterator(), 5).get();
+        });
+    }
 	
 	@Test
 	public void testFirst_Filter() {