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
vʌvr (formerly called Javaslang) is a non-commercial, non-profit object-functional library that runs with Java 8+. It aims to reduce the lines of code and increase code quality.

Vavr is an object-functional language extension to Java 8, which aims to reduce the lines of code and increase code quality. It provides persistent co

vavr 5.1k Jan 3, 2023
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
Functional patterns for Java

λ Functional patterns for Java Table of Contents Background Installation Examples Semigroups Monoids Functors Bifunctors Profunctors Applicatives Mona

null 825 Dec 29, 2022
A library that simplifies error handling for Functional Programming in Java

Faux Pas: Error handling in Functional Programming Faux pas noun, /fəʊ pɑː/: blunder; misstep, false step Faux Pas is a library that simplifies error

Zalando SE 114 Dec 5, 2022
RustScript is a functional scripting language with as much relation to Rust as Javascript has to Java.

RustScript RustScript is a scripting language as much relation to Rust as JavaScript has to Java I made this for a school project; it's meant to be im

Mikail Khan 25 Dec 24, 2022
Stream utilities for Java 8

protonpack A small collection of Stream utilities for Java 8. Protonpack provides the following: takeWhile and takeUntil skipWhile and skipUntil zip a

Dominic Fox 464 Nov 8, 2022
Functional programming course

Functional-Programming-101-Java functional programming course with Mohamed Hammad https://www.youtube.com/playlist?list=PLpbZuj8hP-I6F-Zj1Ay8nQ1rMnmF

Ibrahim 14 Nov 9, 2022
Backport of Java 8's lambda expressions to Java 7, 6 and 5

Retrolambda: Use Lambdas on Java 7 Just as there was Retroweaver et al. for running Java 5 code with generics on Java 1.4, Retrolambda lets you run Ja

Esko Luontola 3.5k Dec 30, 2022
Java 8 annotation processor and framework for deriving algebraic data types constructors, pattern-matching, folds, optics and typeclasses.

Derive4J: Java 8 annotation processor for deriving algebraic data types constructors, pattern matching and more! tl;dr Show me how to write, say, the

null 543 Nov 23, 2022
java port of Underscore.js

underscore-java Requirements Java 1.8 and later or Java 11. Installation Include the following in your pom.xml for Maven: <dependencies> <dependency

Valentyn Kolesnikov 411 Dec 6, 2022
Blazed Café is a library for BlazeOS that enables and improves Java functionality for the IgniteBook platform.

By: Seanpm2001, Et; Al. Top README.md Read this article in a different language Sorted by: A-Z Sorting options unavailable ( af Afrikaans Afrikaans |

Sean P. Myrick V19.1.7.2 2 Sep 5, 2022
Access paged data as a "stream" with async loading while maintaining order

DataStream What? DataStream is a simple piece of code to access paged data and interface it as if it's a single "list". It only keeps track of queued

Thomas 1 Jan 19, 2022
Basic crud operations with json data, main focus is with tests

Spring Crud operations Basic crud operations with json data, main focus is with tests. For future reference Road Map Basic Crud on controllers (done)

Jarno Saastamoinen 1 Feb 1, 2022
Numerical-methods-using-java - Source Code for 'Numerical Methods Using Java' by Haksun Li

Apress Source Code This repository accompanies Numerical Methods Using Java by Haksun Li (Apress, 2022). Download the files as a zip using the green b

Apress 5 Nov 20, 2022
JCTools - Concurrency tools currently missing from the JDK.

JCTools Java Concurrency Tools for the JVM. This project aims to offer some concurrent data structures currently missing from the JDK: SPSC/MPSC/SPMC/

null 3.1k Dec 28, 2022
OpenAPI JSON Schema Generator allows auto-generation of API client libraries with a focus on JSON schema given an OpenAPI Spec

OpenAPI JSON Schema Generator IMPORTANT: before the first release, one will need to build the project locally to use the enhancements, bug fixes in th

OpenAPI Tools 5 Dec 31, 2022
Additional plug-ins and extensions for Java's ImageIO using native libraries

NightMonkeys A collection of ImageIO plugins, adding support for newer image formats. NightMonkeys uses the newer Foreign Linker API available in JDK

Gauthier 20 Dec 3, 2022
JDK main-line development

Welcome to the JDK! For build instructions please see the online documentation, or either of these files: doc/building.html (html version) doc/buildin

OpenJDK 14.8k Dec 29, 2022
AndroidX Media is a collection of libraries for implementing media use cases on Android

AndroidX Media AndroidX Media is a collection of libraries for implementing media use cases on Android, including local playback (via ExoPlayer) and m

Android Jetpack 311 Jan 1, 2023