 
  		        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
                         
                      
                       
          
                Many tasks_proj/tests directories exist in chapters 2, 3, 5 that have tests that use the custom markers smoke and get, which are not decl...
              
            
            
          
              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
 
          
                First, the code resources: 
Page 237:  rumbl_umbrella/apps/rumbl/mix.exs 
Note:  That this file is missing. 
Page 238: rumbl_umbrella/app...
              
            
            
          
              New
 
          
                @noelrappin 
Running the webpack dev server, I receive the following warning: 
ERROR in tsconfig.json 
TS18003: No inputs were found in c...
              
            
            
          
              New
 
          
                I think I might have found a problem involving SwitchCompat, thumbTint, and trackTint. 
As entered, the SwitchCompat changes color to hol...
              
            
            
          
              New
 
          
                When I run the coverage example to report on missing lines, I get: 
pytest --cov=cards --report=term-missing ch7
ERROR: usage: pytest [op...
              
            
            
          
              New
 
          
                Hi, I need some help, I’m new to rust and was learning through your book. but I got stuck at the last stage of distribution. Whenever I t...
              
            
            
          
              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
 
          
                @mfazio23
I’ve applied the changes from Chapter 5 of the book and everything builds correctly and runs. But, when I try to start a game,...
              
            
            
          
              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
                         
                      
                       
          
                Please tell us what is your preferred monitor setup for programming(not gaming) and why you have chosen it. 
Does your monitor have eye p...
              
            
            
          
              New
 
          
                I’m thinking of buying a monitor that I can rotate to use as a vertical monitor? 
Also, I want to know if someone is using it for program...
              
            
            
          
              New
 
          
                I know that -t flag is used along with -i flag for getting an interactive shell. But I cannot digest what the man page for docker run com...
              
            
            
          
              New
 
          
                Thanks to @foxtrottwist’s and @Tomas’s posts in this thread: Poll: Which code editor do you use? I bought Onivim! :nerd_face: 
https://on...
              
            
            
          
              New
New
 
          
                We’ve talked about his book briefly here but it is quickly becoming obsolete - so he’s decided to create a series of 7 podcasts, the firs...
              
            
            
          
              New
 
          
                Rails 7 completely redefines what it means to produce fantastic user experiences and provides a way to achieve all the benefits of single...
              
            
            
              
          
              New
 
          
                Author Spotlight 
Mike Riley 
@mriley 
This month, we turn the spotlight on Mike Riley, author of Portable Python Projects. Mike’s book ...
              
            
            
          
              New
 
          
                A concise guide to MySQL 9 database administration, covering fundamental concepts, techniques, and best practices.
  
Neil Smyth
MySQL...
              
            
            
              
          
              New
 
          
                Background
Lately I am in a quest to find a good quality TTS ai generation tool to run locally in order to create audio for some videos I...
              
            
            
          
              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
- /c-plus-plus
- /crystal
- /tailwind
- /react
- /gleam
- /ocaml
- /flutter
- /elm
- /vscode
- /ash
- /opensuse
- /html
- /centos
- /php
- /zig
- /deepseek
- /scala
- /sublime-text
- /lisp
- /textmate
- /react-native
- /nixos
- /debian
- /agda
- /kubuntu
- /arch-linux
- /django
- /revery
- /ubuntu
- /deno
- /spring
- /manjaro
- /nodejs
- /diversity
- /lua
- /julia
- /c
- /slackware
 
    





