dtonhofer
Functional Programming in Java, Second Edition: Code for "Chapter 7, Ininite Collections" in two files
SimpleTimer.java
package chapter7;
import java.util.function.Supplier;
public abstract class SimpleTimer {
public record Result<T>(long duration_ms, T result) {}
public static <T> chapter7.SimpleTimer.Result<T> timeIt(Supplier<T> supplier) {
long start = System.currentTimeMillis();
T result = supplier.get();
long stop = System.currentTimeMillis();
return new Result<T>(stop - start, result);
}
}
BeingLazy_InfiniteCollections.java
package chapter7;
import org.junit.jupiter.api.Test;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import java.util.stream.Stream;
import static java.util.stream.Collectors.toList;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class BeingLazy_InfiniteCollections {
// If CPU cycles are of no importance...
// "a desparate attempt", p.133
public static boolean isPrimeVeryGorilla(final int number) {
return number > 1 &&
IntStream.rangeClosed(2, (int) Math.sqrt(number))
.noneMatch(divisor -> number % divisor == 0);
}
// This doesn't work as it causes an infinite recursion
// "a desparate attempt", p.134, but with different method & parameter names
public static List<Integer> primesUpwardsFrom_notworking(final int number) {
if (isPrimeVeryGorilla(number)) {
List<Integer> morePrimes = primesUpwardsFrom_notworking(number + 1);
morePrimes.add(0, number);
return morePrimes;
} else {
return primesUpwardsFrom_notworking(number + 1);
}
}
// "lazy/fpij/Primes.java", p.135, but with different method & parameter names
private static int firstPrimeAfter(final int number) {
if (isPrimeVeryGorilla(number + 1)) {
return number + 1;
} else {
return firstPrimeAfter(number + 1);
}
}
// "lazy/fpij/Primes.java", p.135, but with different method & parameter names
private static List<Integer> primesUpwardsFrom(final int fromNumber, final int count) {
return Stream.iterate(firstPrimeAfter(fromNumber - 1), BeingLazy_InfiniteCollections::firstPrimeAfter)
.limit(count)
.collect(toList());
}
// Testing primesUpwardsFrom()
// https://en.wikipedia.org/wiki/List_of_prime_numbers
// https://oeis.org/A000040
@Test
public void generatePrimes() {
final var shall = List.of(101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173,
179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281);
final List<Integer> primesAfter100 = primesUpwardsFrom(100, shall.size());
final String txt = primesAfter100.stream().map(it -> Integer.toString(it)).collect(Collectors.joining(",\n"));
System.out.println(txt);
assertEquals(shall, primesAfter100);
}
// Testing primesUpwardsFrom()
// Similar to "lazy/fpij/Primes.java" on p.136
@Test
public void runBookPrimes() {
List<Integer> l1 = primesUpwardsFrom(1, 10);
List<Integer> l2 = primesUpwardsFrom(100, 5);
assertEquals(List.of(2, 3, 5, 7, 11, 13, 17, 19, 23, 29), l1);
assertEquals(List.of(101, 103, 107, 109, 113), l2);
System.out.println("10 primes from 1: " + l1);
System.out.println("5 primes from 100: " + l2);
}
// It's quite slow!
@Test
void runBookPrimesWithTimer() {
final int limit = 1_000_000;
// not an actual test, just printout
final SimpleTimer.Result<List<Integer>> stRes =
SimpleTimer.timeIt(
() -> primesUpwardsFrom(2, limit)
);
final List<Integer> result = stRes.result();
final String range = (result.isEmpty()) ? "" : "in range [" + result.get(0) + "," + result.get(result.size() - 1) + "] ";
System.out.println("Using book code: finding " + result.size() + " primes " + range + "took " + stRes.duration_ms() + " ms");
}
}
Popular Pragmatic Bookshelf topics
Title: Design and Build Great Web APIs - typo “https://company-atk.herokuapp.com/2258ie4t68jv” (page 19, third bullet in URL list)
Typo:...
New
Hello Brian,
I have some problems with running the code in your book. I like the style of the book very much and I have learnt a lot as...
New
Hi @venkats,
It has been mentioned in the description of ‘Supervisory Job’ title that 2 things as mentioned below result in the same eff...
New
Title: Web Development with Clojure, Third Edition, vB17.0 (p9)
The create table guestbook syntax suggested doesn’t seem to be accepted ...
New
I found an issue in Chapter 7 regarding android:backgroundTint vs app:backgroundTint.
How to replicate:
load chapter-7 from zipfile i...
New
@parrt
In the context of Chapter 4.3, the grammar Java.g4, meant to parse Java 6 compilation units, no longer passes ANTLR (currently 4....
New
Docker-Machine became part of the Docker Toolbox, which was deprecated in 2020, long after Docker Desktop supported Docker Engine nativel...
New
@mfazio23
Android Studio will not accept anything I do when trying to use the Transformations class, as described on pp. 140-141. Googl...
New
From page 13:
On Python 3.7, you can install the libraries with pip by running these commands inside a Python venv using Visual Studio ...
New
I’ve got to the end of Ch. 11, and the app runs, with all tabs displaying what they should – at first. After switching around between St...
New
Other popular topics
Take your Go skills to the next level by learning how to design, develop, and deploy a distributed service. Start from the bare essential...
New
Free and open source software is the default choice for the technologies that run our world, and it’s built and maintained by people like...
New
No chair. I have a standing desk.
This post was split into a dedicated thread from our thread about chairs :slight_smile:
New
Rust is an exciting new programming language combining the power of C with memory safety, fearless concurrency, and productivity boosters...
New
Small essay with thoughts on macOS vs. Linux:
I know @Exadra37 is just waiting around the corner to scream at me “I TOLD YOU SO!!!” but I...
New
Use WebRTC to build web applications that stream media and data in real time directly from one user to another, all in the browser.
...
New
I’m able to do the “artistic” part of game-development; character designing/modeling, music, environment modeling, etc.
However, I don’t...
New
Get the comprehensive, insider information you need for Rails 8 with the new edition of this award-winning classic.
Sam Ruby @rubys
...
New
Hello,
I’m a beginner in Android development and I’m facing an issue with my project setup. In my build.gradle.kts file, I have the foll...
New
Explore the power of Ash Framework by modeling and building the domain for a real-world web application.
Rebecca Le @sevenseacat and ...
New
Categories:
Sub Categories:
Popular Portals
- /elixir
- /rust
- /wasm
- /ruby
- /erlang
- /phoenix
- /keyboards
- /python
- /js
- /rails
- /security
- /go
- /swift
- /vim
- /clojure
- /java
- /emacs
- /haskell
- /typescript
- /svelte
- /onivim
- /kotlin
- /c-plus-plus
- /crystal
- /tailwind
- /react
- /gleam
- /ocaml
- /elm
- /vscode
- /flutter
- /ash
- /html
- /deepseek
- /opensuse
- /zig
- /centos
- /php
- /scala
- /react-native
- /lisp
- /sublime-text
- /textmate
- /nixos
- /debian
- /agda
- /deno
- /django
- /kubuntu
- /arch-linux
- /nodejs
- /spring
- /ubuntu
- /revery
- /manjaro
- /julia
- /diversity
- /lua
- /laravel
- /markdown









