dtonhofer

dtonhofer

Functional Programming in Java, Second Edition: Nicer code pf page 7

I suggest this nicer code for the Statistics.java on page on page 70 (we are doing streams after).

Not using a main() but a JUnit 5 Test Case:

import org.junit.jupiter.api.Test;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

import static java.util.stream.Collectors.averagingDouble;
import static java.util.stream.Collectors.summarizingDouble;

public class TransformingData {

    record Pair(String str, Number num) {

        public String toString() {
            return str + ": " + num;
        }
    }

    @Test
    public void statistics() {
        var statistics = Person.getPeople().stream()
                .collect(
                        summarizingDouble(person -> person.emailAddresses().size()));
        var pairs = new ArrayList<Pair>();
        pairs.add(new Pair("Number of people", statistics.getCount()));
        pairs.add(new Pair("Number of email addresses", statistics.getSum()));
        pairs.add(new Pair("Average number of email addresses", statistics.getAverage()));
        pairs.add(new Pair("Max number of email addresses", statistics.getMax()));
        pairs.add(new Pair("Min number of email addresses", statistics.getMin()));
        String res = pairs.stream().map(Pair::toString).collect(Collectors.joining("\n"));
        System.out.println(res);
    }
}

Similary for the next exercises

    record PairB(String str, Boolean b) {

        public String toString() {
            return str + ": " + b;
        }
    }

    public void printPairsB(List<PairB> pairs) {
        var res = pairs.stream().map(PairB::toString).collect(Collectors.joining("\n"));
        System.out.println(res);
    }

    @Test
    public void checkingForCriteriaAny() {
        List<Person> people = Person.getPeople();
        var pairs = new ArrayList<PairB>();
        pairs.add(new PairB(
                "Anyone has email address: ",
                people.stream().anyMatch(person -> person.emailAddresses().size() > 0)));
        pairs.add(new PairB(
                "Anyone has more than 10 email address: ",
                people.stream().anyMatch(person -> person.emailAddresses().size() > 10)));
        printPairsB(pairs);
    }

    @Test
    public void checkingForCriteriaAll() {
        List<Person> people = Person.getPeople();
        var pairs = new ArrayList<PairB>();
        pairs.add(new PairB(
                "Everyone has at least one email address: ",
                people.stream().allMatch(person -> person.emailAddresses().size() > 0)));
        pairs.add(new PairB(
                "Everyone has zero or more email address: ",
                people.stream().allMatch(person -> person.emailAddresses().size() >= 0)));
        printPairsB(pairs);
    }

And even the next

    record PairN(String str, Number num) {

        public String toString() {
            return str + ": " + num;
        }
    }

    public void printPairsN(List<PairN> pairs) {
        var res = pairs.stream().map(PairN::toString).collect(Collectors.joining("\n"));
        System.out.println(res);
    }

    @Test
    public void partitioning() {
        List<Person> people = Person.getPeople();
        Map<Boolean, List<Person>> partitions =
                people.stream()
                        .collect(partitioningBy(person -> person.emailAddresses().size() > 1));
        var pairs = new ArrayList<PairN>();
        pairs.add(new PairN("Number of people with at most one email address", partitions.get(false).size()));
        pairs.add(new PairN("Number of people with multiple email addresses" , partitions.get(true).size()));
        printPairsN(pairs);
    }

Where Next?

Popular Pragmatic Bookshelf topics Top

jimmykiang
This test is broken right out of the box… — FAIL: TestAgent (7.82s) agent_test.go:77: Error Trace: agent_test.go:77 agent_test.go:...
New
jesse050717
Title: Web Development with Clojure, Third Edition, pg 116 Hi - I just started chapter 5 and I am stuck on page 116 while trying to star...
New
Alexandr
Hi everyone! There is an error on the page 71 in the book “Programming machine learning from coding to depp learning” P. Perrotta. You c...
New
adamwoolhether
When trying to generate the protobuf .go file, I receive this error: Unknown flag: --go_opt libprotoc 3.12.3 MacOS 11.3.1 Googling ...
New
jskubick
I’m under the impression that when the reader gets to page 136 (“View Data with the Database Inspector”), the code SHOULD be able to buil...
New
digitalbias
Title: Build a Weather Station with Elixir and Nerves: Problem connecting to Postgres with Grafana on (page 64) If you follow the defau...
New
brunogirin
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
brunogirin
When installing Cards as an editable package, I get the following error: ERROR: File “setup.py” not found. Directory cannot be installe...
New
Keton
When running the program in chapter 8, “Implementing Combat”, the printout Health before attack was never printed so I assumed something ...
New
roadbike
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

Other popular topics Top

AstonJ
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
PragmaticBookshelf
Brace yourself for a fun challenge: build a photorealistic 3D renderer from scratch! In just a couple of weeks, build a ray tracer that r...
New
DevotionGeo
I know that these benchmarks might not be the exact picture of real-world scenario, but still I expect a Rust web framework performing a ...
New
AstonJ
poll poll Be sure to check out @Dusty’s article posted here: An Introduction to Alternative Keyboard Layouts It’s one of the best write-...
New
PragmaticBookshelf
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
DevotionGeo
I have always used antique keyboards like Cherry MX 1800 or Cherry MX 8100 and almost always have modified the switches in some way, like...
New
sir.laksmana_wenk
I’m able to do the “artistic” part of game-development; character designing/modeling, music, environment modeling, etc. However, I don’t...
New
AnfaengerAlex
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
NewsBot
Node.js v22.14.0 has been released. Link: Release 2025-02-11, Version 22.14.0 'Jod' (LTS), @aduh95 · nodejs/node · GitHub
New
RobertRichards
Hair Salon Games for Girls Fun Girls Hair Saloon game is mainly developed for kids. This game allows users to select virtual avatars to ...
New

Latest in Functional Programming in Java, Second Edition

Functional Programming in Java, Second Edition Portal

Sub Categories: