jOOλ - The Missing Parts in Java 8 jOOλ improves the JDK libraries in areas where the Expert Group's focus was elsewhere. It adds tuple support, function support, and a lot of additional functionality around sequential Streams. The JDK 8's main efforts (default methods, lambdas, and the Stream API) were focused around maintaining backwards compatibility and implementing a functional API for parallelism.

Overview

jOOλ

jOOλ is part of the jOOQ series (along with jOOQ, jOOX, jOOR, jOOU) providing some useful extensions to Java 8 lambdas. It contains these classes:

org.jooq.lambda.function

Why only Function and BiFunction? We have also included support for Function1 through Function16.

org.jooq.lambda.tuple

Tuple support is essential in functional programming. A variety of things can be modelled as tuples, e.g. function argument lists. This is why we support type safe Tuple1 through Tuple16 types.

org.jooq.lambda.Seq

The new Streams API was implemented to provide filter/map/reduce-like operations leveraging the new lambdas. Many of the useful methods that we know from other functional languages (e.g Scala) are missing. This is why jOOλ knows a Seq (short of Sequential) interface that extends Stream and adds a variety of additional methods to.

Please note that all Seq's are sequential and ordered streams, so don't bother to call parallel() on it, it will return the same Seq.

Seq adds a handful of useful methods, such as:

// (1, 2, 3, 4, 5, 6)
Seq.of(1, 2, 3).concat(Seq.of(4, 5, 6));

// true
Seq.of(1, 2, 3, 4).contains(2);

// true
Seq.of(1, 2, 3, 4).containsAll(2, 3);

// true
Seq.of(1, 2, 3, 4).containsAny(2, 5);

// (tuple(1, "A"), tuple(1, "B"), tuple(2, "A"), tuple(2, "B"))
Seq.of(1, 2).crossJoin(Seq.of("A", "B"));

// (tuple(1, 1), tuple(1, 2), tuple(2, 1), tuple(2, 2))
Seq.of(1, 2).crossSelfJoin()

// (1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, ...)
Seq.of(1, 2, 3).cycle();

// tuple((1, 2, 3), (1, 2, 3))
Seq.of(1, 2, 3).duplicate();

// "!abc"
Seq.of("a", "b", "c").foldLeft("!", (u, t) -> u + t);

// "abc!"
Seq.of("a", "b", "c").foldRight("!", (t, u) -> t + u);

// { 1 = (1, 3), 0 = (2, 4) }
Seq.of(1, 2, 3, 4).groupBy(i -> i % 2);

// (tuple(1, (1, 3)), tuple(0, (2, 4)))
Seq.of(1, 2, 3, 4).grouped(i -> i % 2);

// (tuple(1, 1), tuple(2, 2))
Seq.of(1, 2, 4).innerJoin(Seq.of(1, 2, 3), (a, b) -> a == b);

// (tuple(1, 2), tuple(2, 1))
Seq.of(1, 2).innerSelfJoin((t, u) -> t != u)

// (1, 0, 2, 0, 3, 0, 4)
Seq.of(1, 2, 3, 4).intersperse(0);

// "123"
Seq.of(1, 2, 3).join();

// "1, 2, 3"
Seq.of(1, 2, 3).join(", ");

// "^1|2|3$"
Seq.of(1, 2, 3).join("|", "^", "$"); 

// (tuple(1, 1), tuple(2, 2), tuple(4, null))
Seq.of(1, 2, 4).leftOuterJoin(Seq.of(1, 2, 3), (a, b) -> a == b);

// (tuple(tuple(1, 0), NULL), tuple(tuple(2, 1), tuple(1, 0)))
Seq.of(tuple(1, 0), tuple(2, 1)).leftOuterSelfJoin((t, u) -> t.v2 == u.v1)

// (1, 2)
Seq.of(1, 2, 3, 4, 5).limitWhile(i -> i < 3);

// (1, 2)
Seq.of(1, 2, 3, 4, 5).limitUntil(i -> i == 3);

// (1, 2L)
Seq.of(new Object(), 1, "B", 2L).ofType(Number.class);

// (tuple(1, 1), tuple(2, 2), tuple(null, 3))
Seq.of(1, 2, 4).rightOuterJoin(Seq.of(1, 2, 3), (a, b) -> a == b);

// (tuple(NULL, tuple(1, 0)), tuple(tuple(1, 0), tuple(2, 1)))
Seq.of(tuple(1, 0), tuple(2, 1)).rightOuterSelfJoin((t, u) -> t.v1 == u.v2)

// tuple((1, 3), (2, 4))
Seq.of(1, 2, 3, 4).partition(i -> i % 2 != 0);

// (1, 3, 4)
Seq.of(1, 2, 3, 4).remove(2);

// (1, 4)
Seq.of(1, 2, 3, 4).removeAll(2, 3, 5);

// (2, 3)
Seq.of(1, 2, 3, 4).retainAll(2, 3, 5);

// (4, 3, 2, 1)
Seq.of(1, 2, 3, 4).reverse();

// (3, 1, 4, 5, 2) for example
Seq.of(1, 2, 3, 4, 5).shuffle();

// (3, 4, 5)
Seq.of(1, 2, 3, 4, 5).skipWhile(i -> i < 3);

// (3, 4, 5)
Seq.of(1, 2, 3, 4, 5).skipUntil(i -> i == 3);

// (2, 3)
Seq.of(1, 2, 3, 4, 5).slice(1, 3)

// tuple((1, 2), (3, 4, 5))
Seq.of(1, 2, 3, 4, 5).splitAt(2);

// tuple(1, (2, 3, 4, 5))
Seq.of(1, 2, 3, 4, 5).splitAtHead();

// tuple((1, 2, 3), (a, b, c))
Seq.unzip(Seq.of(tuple(1, "a"), tuple(2, "b"), tuple(3, "c")));

// (tuple(1, "a"), tuple(2, "b"), tuple(3, "c"))
Seq.of(1, 2, 3).zip(Seq.of("a", "b", "c"));

// ("1:a", "2:b", "3:c")
Seq.of(1, 2, 3).zip(Seq.of("a", "b", "c"), (x, y) -> x + ":" + y);

// (tuple("a", 0), tuple("b", 1), tuple("c", 2))
Seq.of("a", "b", "c").zipWithIndex();

org.jooq.lambda.Unchecked

Lambda expressions and checked exceptions are a major pain. Even before going live with Java 8, there are a lot of Stack Overflow questions related to the subject:

The Unchecked class can be used to wrap common @FunctionalInterfaces in equivalent ones that are allowed to throw checked exceptions. E.g. this painful beast:

Arrays.stream(dir.listFiles()).forEach(file -> {
    try {
        System.out.println(file.getCanonicalPath());
    }
    catch (IOException e) {
        throw new RuntimeException(e);
    }

    // Ouch, my fingers hurt! All this typing!
});

... will become this beauty:

Arrays.stream(dir.listFiles()).forEach(
    Unchecked.consumer(file -> { System.out.println(file.getCanonicalPath()); })
);

... or if you fancy method references:

Arrays.stream(dir.listFiles())
        .map(Unchecked.function(File::getCanonicalPath))
        .forEach(System.out::println);

Do note that Unchecked also allows you to throw checked exceptions explicitly without the compiler noticing:

// Compiler doesn't see that checked Exception is being thrown:
Unchecked.throwChecked(new Exception());

Download

For use with Java 9+

<dependency>
  <groupId>org.jooq</groupId>
  <artifactId>jool</artifactId>
  <version>0.9.14</version>
</dependency>

For use with Java 8+

<dependency>
  <groupId>org.jooq</groupId>
  <artifactId>jool-java-8</artifactId>
  <version>0.9.14</version>
</dependency>
Comments
  • Add support for Seq.zipAll()

    Add support for Seq.zipAll()

    The current Seq.zip() method "inner zips" two streams, such that the size of the resulting stream is the minimum of the size of each zipped stream.

    Sometimes, it is useful, however, to fully zip all streams, providing Optional values (or nulls) once the shorter stream is depleted. Example:

    // ((1, "A"), (2, "B"))
    Seq.of(1, 2, 3).zip(Seq.of("A", "B"));
    
    // ((1, "A"), (2, "B"), (3, null))
    Seq.of(1, 2, 3).leftOuterZip(Seq.of("A", "B"));
    
    // ((1, "A"), (2, "B"), (null, "C"))
    Seq.of(1, 2).rightOuterZip(Seq.of("A", "B", "C"));
    
    T: Enhancement R: Fixed P: Medium 
    opened by lukaseder 25
  • chunked(long), chunked(Predicate<T>)

    chunked(long), chunked(Predicate)

    I'm looking for a way to take a Seq<T> and transform it to a Seq<List<T>> for batch processing while keeping lazy evaluation. (I am streaming and processing large files from S3 then pushing them back to S3)

    I found the following and have two concerns. http://stackoverflow.com/a/30662609

    1. Note that this solution unnecessarily stores the whole input stream to the intermediate Map (unlike, for example, Ben Manes solution) Is this accurate?
    2. I believe the groupBy would exhaust the entire stream. In my case the file may not fit in memory so this would not work if that is the case.

    Would the above be worth creating a helper for? Or would it be worth making something similar to Guavas Iterables.partition

    T: Enhancement R: Wontfix P: Medium 
    opened by billoneil 23
  • New Extension of CompletableFuture or a new implementation of CompletionStage

    New Extension of CompletableFuture or a new implementation of CompletionStage

    CompletableFutures API seems a bit off. It would be nice to have an implementation that remembered its Executor and used it by default for all async operations instead of the common pool. Also a shorter name might be nice.

    Simplified possible implementation.

    // Promise might not be a great name
    public class Promise<T> implements Future<T>, CompletionStage<T> {
        private final CompletableFuture<T> future;
        private final Executor defaultExecutor;
    
        // This could be private and use static methods the same way CompletableFuture does.
        public Promise(CompletableFuture<T> future, Executor defaultExecutor) {
            this.future = future;
            this.defaultExecutor = defaultExecutor;
        }
    
        @Override
        public <U> Promise<U> thenApply(Function<? super T, ? extends U> fn) {
            return new Promise<>(future.thenApply(fn), defaultExecutor);
        }
    
        @Override
        public <U> Promise<U> thenApplyAsync(Function<? super T, ? extends U> fn) {
            return new Promise<>(future.thenApplyAsync(fn), defaultExecutor);
        }
    
        @Override
        public <U> Promise<U> thenApplyAsync(Function<? super T, ? extends U> fn, Executor executor) {
            return new Promise<>(future.thenApplyAsync(fn), executor);
        }
    
        public T join() {
            return future.join();
        }
    
        public CompletableFuture<T> getCompletableFuture() {
            return future;
        }
    
    }
    

    This would allow us to use CompletableFuture under the hood and get any future improvements from it. It would gain the benefit of remembering the last Executor used.

    T: Enhancement R: Fixed P: Medium 
    opened by billoneil 18
  • [#296] Added chunked(long), chunked(Predicate<T>)

    [#296] Added chunked(long), chunked(Predicate)

    #296 I have two of the implementations working and they should be truly lazy.

    • [x] chunked(long chunkSize)
    • [x] chunked(Predicate predicate)
    • [ ] chunked(Predicate predicate, boolean excludeDelimiter) ?
    • [ ] chunkedWithIndex(BiPredicate<T, Long> biPredicate)

    I'm not sure happy with how the code turned out. The two iterators are a little dependent on each other. Maybe a better approach would be to make a more top level peeking iterator instead of hacking it like I did.

    T: Enhancement R: Wontfix P: Medium 
    opened by billoneil 16
  • Add Consumer1<Tuple[N]<T1, ..., TN>> Tuple.consumer(Consumer[N]<T1, ..., TN>) and Function1<Tuple[N]<T1, ..., TN>> Tuple.function(Function[N]<T1, ..., TN>)

    Add Consumer1> Tuple.consumer(Consumer[N]) and Function1> Tuple.function(Function[N])

    Does anything like the following currently exist in jOOL, or would there be any appetite for adding something like it? I created my own, as I couldn't find anything.

    public class Tuple2Lambdas {
    
        public static <A, B> Predicate<Tuple2<A, B>> predicate(BiPredicate<A, B> predicate) {
    
            return (tuple) -> predicate.test(tuple.v1, tuple.v2);
    
        }
    
        public static <A, B, R> Function<Tuple2<A, B>, R> function(BiFunction<A, B, R> function) {
    
            return (tuple) -> function.apply(tuple.v1, tuple.v2);
    
        }
    
        public static <A, B> Consumer<Tuple2<A, B>> consumer(BiConsumer<A, B> consumer) {
    
            return (tuple) -> consumer.accept(tuple.v1, tuple.v2);
    
        }
    
    }
    

    This allows the following:

            Seq.seq(tuple2List)
                .filter(predicate(this::validHit))
                .map(function(this::getDisplayMatch))
                .forEach(consumer(this::processResult));
    

    or:

            Seq.seq(tuple2List)
                .filter(predicate((hit, property) -> hit.getId().equals("blah")))
                .map(function((hit, property) -> tuple(hit.explanation(), property.getId())))
    

    rather than the more long winded:

            Seq.seq(tuple2List)
                .filter(tuple -> validHit(tuple.v1, tuple.v2))
                .map(tuple -> getDisplayMatch(tuple.v1, tuple.v2))
                .forEach(tuple -> processResult(tuple.v1, tuple.v2));
    

    or more opaque:

            Seq.seq(tuple2List)
                .filter((tuple) -> tuple.v2.getId().equals("blah"))
                .map((tuple) -> tuple(tuple.v1.explanation(), tuple.v2.getId())
    

    Most times when I've rolled my own solutions to Java's lambda limitations I then find jOOL has beaten me to it, but I couldn't find anything in this case.

    T: Enhancement R: Fixed P: Medium 
    opened by lukens 14
  • implement of issue 151, linear regression

    implement of issue 151, linear regression

    Fixed #151

    All of the functions follows the link of https://docs.oracle.com/database/121/SQLRF/functions165.htm#SQLRF00696. The formula of calculations are standard formulas. There are totally 9 functions implemented, as mentioned in the link.

    As for the test cases, there includes the empty Seq test, and the test with self defined class and Tuple2. All the tests have passed with no conflicts with other tests.

    T: Enhancement R: Fixed P: Medium 
    opened by Lu-Jichen 13
  • Add Seq.seq(Supplier<? extends T>)

    Add Seq.seq(Supplier)

    Seq.lazy(Supplier<? extends Stream<T>>) would take a Stream supplier and turn it (lazily) into a Seq.

    If we wanted to support other types (e.g. IntStream, Iterable<T>, Optional<T>, T) we'd have to use different names for each method because of Supplier's type erasure, e.g. lazySeq, lazyIntSeq, lazyIterable, lazyOptional, lazyValue (they would generally correspond to what can be non-lazily obtained by Seq.of and Seq.seq).

    For me, however, simple Seq.lazy() would be quite enough because it's just a matter of calling Seq.of or Seq.seq inside the lazy Supplier body.

    T: Enhancement R: Fixed P: Medium 
    opened by tlinkowski 13
  • Added Curry methods to Functions

    Added Curry methods to Functions

    As per: #87

    Added curry() methods to all Functions, allowing them to be partially applied and return a new function that accepts the remaining arguments.

    T: Enhancement P: Medium 
    opened by DillonJettCallis 12
  • Add Seq.lazy()

    Add Seq.lazy()

    This is my second attempt to propose Seq.lazy() (see #302 for details).

    Here, I propose it together with the reimplementations of the following methods mentioned in #195 (in order to demonstrate the real usefulness of Seq.lazy):

    • shuffle() (provided simpler implementation)
    • reverse()
    • removeAll()
    • retainAll()
    • window() (this has to be adapted by @lukaseder in jOOQ-tools)

    I did not reimplement the following methods (although they eagerly call iterator() or spliterator(), they do not try to iterate it immediately so they don't seem to be problematic in practice):

    • zip(), zipAll()
    • SeqUtils.transform()
    • grouped
    • partition (returns Tuple - could not use Seq.lazy)
    • duplicate() (returns Tuple - in this particular case I'd implement it using SeqBuffer proposed in #305)

    Reimplementation of the remaining methods mentioned in #195 (i.e. all kinds of joins) was proposed in #305.

    T: Enhancement R: Wontfix P: Medium 
    opened by tlinkowski 11
  • Question: Singleton Seq of Array

    Question: Singleton Seq of Array

    Hi Lukas,

    I'm not convinced about the java.util.stream.Stream.of() API. There are

    • Stream.of(T t) respectively Seq.of(T t)
    • Stream.of(T... values) respectively Seq.of(T... values)

    which does not allow us to create a Stream/Seq of an Array, i.e.

    • Seq.of(new String[] { "hello" }) is a Seq<String> instead of a Seq<String[]>

    Workaround:

    • Seq.of(new String[][]{{ "" }}), which is ugly

    Just want to hear your opinion about the practical value of having a special API for a singleton Array Seq.

    And also: What is the use case for a Stream.of(T t). If there would be only a Stream.of(T... values) we could also call Stream.of(t)!? Looking at the implementation of java.util.stream.Stream.of(T t) I see a difference, but from the API perspective I don't see the point.

    - Daniel

    T: Support request P: Medium 
    opened by danieldietrich 11
  • Add method to create maps from streams with the stream objects as the map values

    Add method to create maps from streams with the stream objects as the map values

    I've been using this construction a lot lately:

    Seq<SomeObject> seq = ...;
    Map<Integer, SomeObject> objectMap = seq.toMap(SomeObject::getId, Function.identity());
    

    And I've think this sugar-addition would be nice for jOOL.

    interface Collectable<T> {
        /**
         * Collect the collectable into a {@link Map} with the given keys
         * and the self element as value.
         */
        <K> Map<K, T> toIdentityMap(Function<? super T, ? extends K> keyMapper);
    }
    

    I can provide a PR. Alternative names to toIdentityMap are very welcome. ;-)

    T: Enhancement R: Fixed P: Medium 
    opened by sargue 10
  • Add Predicate<Tuple[N]<T...>> Tuple.predicate(Predicate[N]<T...>)

    Add Predicate> Tuple.predicate(Predicate[N])

    I re-propose attention to an old issue that has not yet been fully solved: #214

    Currently jOOL offers:

    Function<Tuple[N]<T...>, R> Tuple.function(Function[N]<T..., R>)
    Consumer<Tuple[N]<T...>>    Tuple.consumer(Consumer[N]<T...>)
    

    But it misses:

    Predicate<Tuple[N]<T...>>   Tuple.predicate(Predicate[N]<T...>)
    

    In order to beautify stream processing like that:

    Seq.of(tuple("marco", 24), tuple("luigi", 16), tuple("maria", 18))
       .filter(Tuple.predicate((name, age) -> age > 17))
       .map(Tuple.function((name, age) -> tuple("Sir / Madame " + name, age)))
       .forEach(Tuple.consumer((name, age) -> process(options, name, age)));
    
    T: Enhancement P: Medium 
    opened by gekoramy 5
  • Add support for PERCENTILE_CONT semantics

    Add support for PERCENTILE_CONT semantics

    Expected behavior and actual behavior:

    Re: Median definition. See code examples below.

    The Agg.percentileBy method incorrectly assumes that index rounding is enough, but isn't when the the (size * percentile) still has an effectively non-zero factional part, and the floor indexed value and the next value are not equal.

    I appreciate that not all Comparable types can be, or easily, added and divided, so I suggest that a modified percentile method, and median method, be added, accepting a type specific function, with parameters for the floor indexed value, the next indexed value and the fractional part of the index, to allow returning a more correct value. The function would only need to be called when the index has an effectively non-zero fractional part and the relevant indexed values are different. Any such new functionally should also exposed anywhere else the existing median and percentile* methods are also exposed e.g. Window.

    Steps to reproduce the problem:

    e.g. for median

    Seq.of(1d,2d,3d,4d,5d,6d,7d).median().ifPresent(System.out::println);
    

    prints 4.0, which is correct, because the exact middle value is 4.0,

    Seq.of(1d,2d,3d,4d,5d,6d,7d,8d).median().ifPresent(System.out::println);
    

    prints 4.0 which is apparently incorrect, because the middle values are 4 and 5, so should print (4 + 5) / 2 = 4.5

    Versions:

    • jOOλ: 0.9.14
    • Java: 15
    T: Enhancement P: Medium 
    opened by rwperrott 6
  • Bad interaction between window() and limit()

    Bad interaction between window() and limit()

    Expected behavior and actual behavior:

    I'm building a Seq that contains limit() and window() terms and I'm seeing some surprising behavior:

    • If the limit() comes after the window() it appears that the iterator that the Seq is based on gets completely drained even though the stream terminates as expected after the number of items specified in the limit() are processed.
    • If the limit() comes before the window() the iterator is not drained. (The stream also terminates as expected.)

    In my real scenario, the iterator that the Seq is based on is an iterator on top of a DB cursor and the limit() comes after the window(). I really need the behavior to not be that the code tries to drain this iterator--i.e., read a ton of rows from the DB.

    Is this a bug or just the way things work?

    Steps to reproduce the problem:

    I've attached a simple program that exhibits the behavior.

    Versions:

    • jOOλ: 0.9.12
    • Java: 1.8
    T: Defect P: Medium 
    opened by nmishkin 1
  • Don't swap Range bounds by default

    Don't swap Range bounds by default

    Currently, when using the Range type, bounds are swapped by default, if they are not in order. This can be convenient occasionally, but incorrect in other cases. With the suggestion of supporting (partially) unbounded ranges (#350), swapping may become wrong.

    We should introduce new API that allows for swapping explicitly (akin to SQL's BETWEEN SYMMETRIC) and stop swapping implicitly.

    This is an incompatible change. We might not actually implement it.

    T: Enhancement P: Medium T: Incompatible Change 
    opened by lukaseder 3
  • Tuple.collectors() should be able to share state

    Tuple.collectors() should be able to share state

    The current Tuple.collectors() implementation is a canonical one, where collectors are completely independent of one another. It would be better if they could share state in case they're related. For example, when calculating a set of percentiles:

    var percentiles =
    Stream.of(1, 2, 3, 4, 10, 9, 3, 3).collect(
      Tuple.collectors(
        Agg.<Integer>percentile(0.0),
        Agg.<Integer>percentile(0.25),
        Agg.<Integer>percentile(0.5),
        Agg.<Integer>percentile(0.75),
        Agg.<Integer>percentile(1.0)
      )
    );
     
    System.out.println(percentiles);
    

    It would be great if the 5 collectors could somehow share their internal state, which is a sorted list of all values in the stream. Executing 1 sort instead of 5 is definitely preferrable.

    This can be implemented in 2 ways:

    • Optimising for specific collector usage
    • Optimising this in general
    T: Enhancement P: Medium 
    opened by lukaseder 8
Owner
jOOQ Object Oriented Querying
jOOQ Object Oriented Querying
Carbyne Stack tuple store for secure multiparty computation

Carbyne Stack Castor Tuple Store Castor is an open source storage service for cryptographic material used in Secure Multiparty Computation, so called

Carbyne Stack 5 Oct 15, 2022
Dremio - the missing link in modern data

Dremio Dremio enables organizations to unlock the value of their data. Documentation Documentation is available at https://docs.dremio.com. Quickstart

Dremio 1.2k Dec 31, 2022
A Primitive Collection library that reduces memory usage and improves performance

Primitive-Collections This is a Simple Primitive Collections Library i started as a hobby Project. It is based on Java's Collection Library and FastUt

Speiger 26 Dec 25, 2022
High Performance data structures and utility methods for Java

Agrona Agrona provides a library of data structures and utility methods that are a common need when building high-performance applications in Java. Ma

Real Logic 2.5k Jan 5, 2023
Eclipse Collections is a collections framework for Java with optimized data structures and a rich, functional and fluent API.

English | 中文 | Deutsch | Español | Ελληνικά | Français | 日本語 | Norsk (bokmål) | Português-Brasil | Русский | हिंदी Eclipse Collections is a comprehens

Eclipse Foundation 2.1k Dec 29, 2022
Zero-dependency Reactive Streams publishers library

⚡️ Mutiny Zero: a zero-dependency Reactive Streams publishers library for Java Mutiny Zero is a minimal API for creating reactive-streams compliant pu

SmallRye 14 Dec 14, 2022
An advanced, but easy to use, platform for writing functional applications in Java 8.

Getting Cyclops X (10) The latest version is cyclops:10.4.0 Stackoverflow tag cyclops-react Documentation (work in progress for Cyclops X) Integration

AOL 1.3k Dec 29, 2022
Table-Computing (Simplified as TC) is a distributed light weighted, high performance and low latency stream processing and data analysis framework. Milliseconds latency and 10+ times faster than Flink for complicated use cases.

Table-Computing Welcome to the Table-Computing GitHub. Table-Computing (Simplified as TC) is a distributed light weighted, high performance and low la

Alibaba 34 Oct 14, 2022
Stream summarizer and cardinality estimator.

Description A Java library for summarizing data in streams for which it is infeasible to store all events. More specifically, there are classes for es

AddThis 2.2k Dec 30, 2022
Lightweight threads for Java, with message passing, nio, http and scheduling support.

Kilim: Continuations, Fibers, Actors and message passing for the JVM

Sriram Srinivasan 1.7k Jan 3, 2023
Immutable in-memory R-tree and R*-tree implementations in Java with reactive api

rtree In-memory immutable 2D R-tree implementation in java using RxJava Observables for reactive processing of search results. Status: released to Mav

Dave Moten 999 Dec 20, 2022
Zero is a core test automation project that can be used as a basis for any kind of test automation project (API, Browser, Mobile)

Zero Zero is our feature rich, core test automation framework, that can be used as an underlying automation framework for any/and all kind of test aut

Pramod Kumar Yadav 10 Dec 16, 2022
A Java library for quickly and efficiently parsing and writing UUIDs

fast-uuid fast-uuid is a Java library for quickly and efficiently parsing and writing UUIDs. It yields the most dramatic performance gains when compar

Jon Chambers 142 Jan 1, 2023
gRPC and protocol buffers for Android, Kotlin, and Java.

Wire “A man got to have a code!” - Omar Little See the project website for documentation and APIs. As our teams and programs grow, the variety and vol

Square 3.9k Jan 5, 2023
The Java collections framework provides a set of interfaces and classes to implement various data structures and algorithms.

Homework #14 Table of Contents General Info Technologies Used Project Status Contact General Information Homework contains topics: Sorting an ArrayLis

Mykhailo 1 Feb 12, 2022
Hollow is a java library and toolset for disseminating in-memory datasets from a single producer to many consumers for high performance read-only access.

Hollow Hollow is a java library and toolset for disseminating in-memory datasets from a single producer to many consumers for high performance read-on

Netflix, Inc. 1.1k Dec 25, 2022
Java Collections till the last breadcrumb of memory and performance

Koloboke A family of projects around collections in Java (so far). The Koloboke Collections API A carefully designed extension of the Java Collections

Roman Leventov 967 Nov 14, 2022
LWJGL is a Java library that enables cross-platform access to popular native APIs useful in the development of graphics (OpenGL, Vulkan), audio (OpenAL), parallel computing (OpenCL, CUDA) and XR (OpenVR, LibOVR) applications.

LWJGL - Lightweight Java Game Library 3 LWJGL (https://www.lwjgl.org) is a Java library that enables cross-platform access to popular native APIs usef

Lightweight Java Game Library 4k Dec 29, 2022