MCPcopy Index your code
hub / github.com/aNNiMON/Lightweight-Stream-API

github.com/aNNiMON/Lightweight-Stream-API @v1.2.2

Chat with this repo
repository ↗ · DeepWiki ↗ · release v1.2.2 ↗ · + Follow
3,780 symbols 17,921 edges 530 files 742 documented · 20%
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

Lightweight-Stream-API

Coverage Status SonarCloud Status SonarCloud Quality Gate
Build Status Maven Central JavaDocs

Stream API from Java 8 rewritten on iterators for Java 7 and below.

Includes

  • Functional interfaces (Supplier, Function, Consumer etc);
  • Stream/IntStream/LongStream/DoubleStream (without parallel processing, but with a variety of additional methods and with custom operators);
  • Optional/OptionalBoolean/OptionalInt/OptionalLong/OptionalDouble classes;
  • Exceptional class - functional way to deal with exceptions;
  • Objects from Java 7.

Usage

Stream.of(/* array | list | set | map | anything based on Iterator/Iterable interface */)
    .filter(..)
    .map(..)
    ...
    .sorted()
    .forEach(..);
Stream.of(value1, value2, value3)...
IntStream.range(0, 10)...

Example project: https://github.com/aNNiMON/Android-Java-8-Stream-Example

Key features

Custom operators

Unlike Java 8 streams, Lightweight-Stream-API provides the ability to apply custom operators.

Stream.of(...)
    .custom(new Reverse<>())
    .forEach(...);

public final class Reverse<T> implements UnaryOperator<Stream<T>> {

    @Override
    public Stream<T> apply(Stream<T> stream) {
        final Iterator<? extends T> iterator = stream.getIterator();
        final ArrayDeque<T> deque = new ArrayDeque<T>();
        while (iterator.hasNext()) {
            deque.addFirst(iterator.next());
        }
        return Stream.of(deque.iterator());
    }
}

You can find more examples here.

Additional operators

In addition to backported Java 8 Stream operators, the library provides:

  • filterNot - negated filter operator

java // Java 8 stream.filter(((Predicate<String>) String::isEmpty).negate()) // LSA stream.filterNot(String::isEmpty)

  • select - filters instances of the given class

java // Java 8 stream.filter(Integer.class::isInstance) // LSA stream.select(Integer.class)

  • withoutNulls - filters only not null elements

java Stream.of("a", null, "c", "d", null) .withoutNulls() // [a, c, d]

  • sortBy - sorts by extractor function

java // Java 8 stream.sorted(Comparator.comparing(Person::getName)) // LSA stream.sortBy(Person::getName)

  • groupBy - groups by extractor function

java // Java 8 stream.collect(Collectors.groupingBy(Person::getName)).entrySet().stream() // LSA stream.groupBy(Person::getName)

  • chunkBy - partitions sorted stream by classifier function

java Stream.of("a", "b", "cd", "ef", "gh", "ij", "klmnn") .chunkBy(String::length) // [[a, b], [cd, ef, gh, ij], [klmnn]]

  • sample - emits every n-th elements

java Stream.rangeClosed(0, 10) .sample(2) // [0, 2, 4, 6, 8, 10]

  • slidingWindow - partitions stream into fixed-sized list and sliding over the elements

java Stream.rangeClosed(0, 10) .slidingWindow(4, 6) // [[0, 1, 2, 3], [6, 7, 8, 9]]

  • takeWhile / dropWhile - introduced in Java 9, limits/skips stream by predicate function

java Stream.of("a", "b", "cd", "ef", "g") .takeWhile(s -> s.length() == 1) // [a, b] Stream.of("a", "b", "cd", "ef", "g") .dropWhile(s -> s.length() == 1) // [cd, ef, g]

  • scan - iteratively applies accumulation function and returns Stream

java IntStream.range(1, 6) .scan((a, b) -> a + b) // [1, 3, 6, 10, 15]

  • indexed - adds an index to every element, result is IntPair

java Stream.of("a", "b", "c") .indexed() // [(0 : "a"), (1 : "b"), (2 : "c")]

  • filterIndexed / mapIndexed / takeWhileIndexed / takeUntilIndexed / dropWhileIndexed / reduceIndexed / forEachIndexed - indexed specialization of operators

java Stream.of("a", "b", "c") .mapIndexed((i, s) -> s + Integer.toString(i)) // [a0, b1, c2]

Throwable functions

No more ugly try/catch in lambda expressions.

// Java 8
stream.map(file -> {
    try {
        return new FileInputStream(file);
    } catch (IOException ioe) {
        return null;
    }
})
// LSA
stream.map(Function.Util.safe(FileInputStream::new))

Download

Download latest release or grab via Maven:

<dependency>
  <groupId>com.annimon</groupId>
  <artifactId>stream</artifactId>
  <version>1.2.2</version>
</dependency>

or Gradle:

dependencies {
  ...
  implementation 'com.annimon:stream:1.2.2'
  ...
}

or use latest unrealeased features with JitPack.

Also included version for Java ME. Checkout javame branch.

Extension points exported contracts — how you extend this code

IntMapMultiConsumer (Interface)
Represents an operation on two input arguments. @since 1.2.2 @see #mapMulti(com.annimon.stream.IntStream.IntMapMultiCon [57 …
stream/src/main/java/com/annimon/stream/IntStream.java
DoubleMapMultiConsumer (Interface)
Represents an operation on two input arguments. @since 1.2.2 @see #mapMulti(com.annimon.stream.DoubleStream.DoubleMapMu [57 …
stream/src/main/java/com/annimon/stream/DoubleStream.java
LongMapMultiConsumer (Interface)
Represents an operation on two input arguments. @since 1.2.2 @see #mapMulti(com.annimon.stream.LongStream.LongMapMultiC [57 …
stream/src/main/java/com/annimon/stream/LongStream.java
IndexedDoubleFunction (Interface)
Represents a function which produces result from index and input argument. @param the type of the result of the fun [79 …
stream/src/main/java/com/annimon/stream/function/IndexedDoubleFunction.java
IntBinaryOperator (Interface)
Represents an operation upon two int-valued operands and producing an int-valued result. This is the pr [22 implementers]
stream/src/main/java/com/annimon/stream/function/IntBinaryOperator.java

Core symbols most depended-on inside this repo

custom
called by 404
stream/src/main/java/com/annimon/stream/Stream.java
requireNonNull
called by 231
stream/src/main/java/com/annimon/stream/Objects.java
of
called by 213
stream/src/main/java/com/annimon/stream/Stream.java
of
called by 151
stream/src/main/java/com/annimon/stream/DoubleStream.java
of
called by 147
stream/src/main/java/com/annimon/stream/IntStream.java
of
called by 143
stream/src/main/java/com/annimon/stream/LongStream.java
apply
called by 135
stream/src/main/java/com/annimon/stream/function/Function.java
filter
called by 134
stream/src/main/java/com/annimon/stream/Stream.java

Shape

Method 3,099
Class 600
Interface 79
Enum 2

Languages

Java100%

Modules by API surface

stream/src/main/java/com/annimon/stream/Stream.java80 symbols
stream/src/test/java/com/annimon/stream/OptionalTest.java73 symbols
stream/src/test/java/com/annimon/stream/internal/SpinedBufferTest.java70 symbols
stream/src/main/java/com/annimon/stream/internal/SpinedBuffer.java62 symbols
stream/src/test/java/com/annimon/stream/CollectorsTest.java60 symbols
stream/src/main/java/com/annimon/stream/IntStream.java60 symbols
stream/src/main/java/com/annimon/stream/LongStream.java59 symbols
stream/src/main/java/com/annimon/stream/DoubleStream.java58 symbols
stream/src/test/java/com/annimon/stream/ExceptionalTest.java54 symbols
stream/src/test/java/com/annimon/stream/OptionalIntTest.java49 symbols
stream/src/test/java/com/annimon/stream/OptionalDoubleTest.java49 symbols
stream/src/test/java/com/annimon/stream/OptionalLongTest.java47 symbols

For agents

$ claude mcp add Lightweight-Stream-API \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact