This is an automated email from the ASF dual-hosted git repository. andy pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/jena.git
commit 7b4d6c631be46186947061495edf970555dc7df7 Author: Andy Seaborne <[email protected]> AuthorDate: Wed Feb 4 18:10:32 2026 +0000 Add Iter.mapRemove --- .../java/org/apache/jena/atlas/iterator/Iter.java | 27 ++++++++++++ .../org/apache/jena/atlas/iterator/TestIter.java | 48 +++++++++++++++++++++- 2 files changed, 73 insertions(+), 2 deletions(-) diff --git a/jena-base/src/main/java/org/apache/jena/atlas/iterator/Iter.java b/jena-base/src/main/java/org/apache/jena/atlas/iterator/Iter.java index ac8cc3fc43..b32ee61c03 100644 --- a/jena-base/src/main/java/org/apache/jena/atlas/iterator/Iter.java +++ b/jena-base/src/main/java/org/apache/jena/atlas/iterator/Iter.java @@ -420,6 +420,15 @@ public class Iter<T> implements IteratorCloseable<T> { return new IterMap<>(stream, converter); } + /** + * Apply a function to every element of an iterator, transforming it + * from a {@code T} to an {@code R}. If the mapped object is null, skip + * this mapping. Equivalent to {@code removeNulls(map(stream, mapper)) } + */ + public static <T, R> Iterator<R> mapRemove(Iterator<T> stream, Function<T, R> mapper) { + return Iter.iter(stream).map(mapper).removeNulls(); + } + private static final class IterMap<T,R> implements IteratorCloseable<R> { private final Iterator<? extends T> stream; private final Function<T, R> converter; @@ -931,6 +940,13 @@ public class Iter<T> implements IteratorCloseable<T> { this.iterator = iterator; } + /** + * Unwrap the iterator. + */ + public Iterator<T> get() { + return iterator; + } + @Override public void close() { Iter.close(iterator); @@ -1021,6 +1037,17 @@ public class Iter<T> implements IteratorCloseable<T> { public <R> Iter<R> flatMap(Function<T, Iterator<R>> converter) { return iter(flatMap(iterator, converter)); } + + // Convenience form. + /** + * Map each element using given function. + * If the function returns null, filter out this element. + * Equivalent to {@code .map(mapper).removeNulls()} + */ + public <R> Iter<R> mapRemoveNulls(Function<T, R> converter) { + return this.map(converter).removeNulls(); + } + /** * Apply an action to everything in the stream, yielding a stream of the * original items. diff --git a/jena-base/src/test/java/org/apache/jena/atlas/iterator/TestIter.java b/jena-base/src/test/java/org/apache/jena/atlas/iterator/TestIter.java index a63fd2d2d0..7d0d2a1538 100644 --- a/jena-base/src/test/java/org/apache/jena/atlas/iterator/TestIter.java +++ b/jena-base/src/test/java/org/apache/jena/atlas/iterator/TestIter.java @@ -21,6 +21,7 @@ package org.apache.jena.atlas.iterator; +import static java.util.stream.Collectors.toList; import static org.junit.jupiter.api.Assertions.assertEquals ; import static org.junit.jupiter.api.Assertions.assertFalse ; import static org.junit.jupiter.api.Assertions.assertTrue ; @@ -218,16 +219,59 @@ public class TestIter @Test public void map_01() { - Iterator<String> it = Iter.map(data2.iterator(), item -> item + item); + Iterator<String> it = Iter.map(data2.iterator(), TestIter::strAction); test(it, "xx", "yy", "zz"); } @Test public void map_02() { - Iterator<String> it = Iter.map(data2.iterator(), item -> item + item); + Iterator<String> it = Iter.map(data2.iterator(), TestIter::strAction); testWithForeachRemaining(it, "xx", "yy", "zz"); } + @Test + public void mapRemove_01() { + List<String> input = List.of(); + Iterator<String> output = Iter.mapRemove(input.iterator(), TestIter::strActionOrNull); + test(output); + } + + @Test + public void mapRemove_02() { + List<String> input = List.of("a", "b"); + Iterator<String> output = Iter.mapRemove(input.iterator(), TestIter::strActionOrNull); + test(output, "aa", "bb"); + } + + @Test + public void mapRemove_03() { + List<String> input = List.of("!"); + Iterator<String> output = Iter.mapRemove(input.iterator(), TestIter::strActionOrNull); + test(output); + } + + @Test + public void mapRemove_04() { + List<String> input = List.of("a", "!", "b"); + Iterator<String> output = Iter.mapRemove(input.iterator(), TestIter::strActionOrNull); + test(output, "aa", "bb"); + } + + private static String strAction(String string) { + if ( string == null ) + return null; + return string+string; + } + + private static String strActionOrNull(String string) { + if ( string == null ) + return null; + if ( string.startsWith("!") ) + return null; + return string+string; + } + + @Test public void flatmap_01() { Iterator<String> it = Iter.flatMap(data2.iterator(), item -> Arrays.asList(item+item, item).iterator());
