 
  		        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
                         
                      
                       
          
                As per the title, thanks.
              
            
            
          
              New
 
          
                Hi Brian, 
Looks like the api for tinydb has changed a little. Noticed while working on chapter 7 that the .purge() call to the db throws...
              
            
            
          
              New
 
          
                Title: Hands-On Rust (Chapter 11: prefab) 
Just played a couple of amulet-less games.  With a bit of debugging, I believe that your can_p...
              
            
            
          
              New
 
          
                I thought that there might be interest in using the book with Rails 6.1 and Ruby 2.7.2. I’ll note what I needed to do differently here. 
...
              
            
            
          
              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
 
          
                Hello! Thanks for the great book. 
I was attempting the Trie (chap 17) exercises and for number 4 the solution provided for the autocorre...
              
            
            
          
              New
 
          
                I ran this command after installing the sample application: 
$ cards add do something --owner Brian 
And got a file not found error: 
Fil...
              
            
            
          
              New
 
          
                Skimming ahead, much of the following is explained in Chapter 3, but new readers (like me!) will hit a roadblock in Chapter 2 with their ...
              
            
            
          
              New
 
          
                Book: Programming Phoenix LiveView, page 142 (157/378), file lib/pento_web/live/product_live/form_component.ex, in the function below: 
d...
              
            
            
          
              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
Other popular topics
                         
                      
                       
          
                A thread that every forum needs! 
Simply post a link to a track on YouTube (or SoundCloud or Vimeo amongst others!) on a separate line an...
              
            
            
          
              New
New
 
          
                I’ve been hearing quite a lot of comments relating to the sound of a keyboard, with one of the most desirable of these called ‘thock’, he...
              
            
            
          
              New
 
          
                Think Again 50% Off Sale »
The theme of this sale is new perspectives on familiar topics. 
Enter coupon code ThinkAgain2021 at checkout t...
              
            
            
          
              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
 
          
                Programming Ruby is the most complete book on Ruby, covering both the language itself and the standard library as well as commonly used t...
              
            
            
              
          
              New
 
          
                zig/http.zig at 7cf2cbb33ef34c1d211135f56d30fe23b6cacd42 · ziglang/zig. 
General-purpose programming language and toolchain for maintaini...
              
            
            
              
          
              New
 
          
                Will Swifties’ war on AI fakes spark a deepfake porn reckoning? 
              
            
            
              
          
              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
 
          
                Fight complexity and reclaim the original spirit of agility by learning to simplify how you develop software. The result: a more humane a...
              
            
            
              
          
              New
Categories:
Sub Categories:
Popular Portals
- /elixir
- /rust
- /ruby
- /wasm
- /erlang
- /phoenix
- /keyboards
- /python
- /rails
- /js
- /security
- /go
- /swift
- /vim
- /clojure
- /haskell
- /emacs
- /java
- /svelte
- /onivim
- /typescript
- /kotlin
- /crystal
- /c-plus-plus
- /tailwind
- /react
- /gleam
- /ocaml
- /elm
- /flutter
- /vscode
- /ash
- /opensuse
- /html
- /centos
- /php
- /zig
- /deepseek
- /scala
- /lisp
- /sublime-text
- /textmate
- /react-native
- /nixos
- /debian
- /agda
- /kubuntu
- /arch-linux
- /django
- /revery
- /ubuntu
- /deno
- /spring
- /manjaro
- /nodejs
- /diversity
- /lua
- /julia
- /c
- /slackware
 
    





