Skip to main content
Dat 2. semester Bornholm
Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

Streams API

Dag 1

1. Streams API – grundlæggende

I denne øvelse arbejder du med en liste af bøger og bruger Stream API’et til forskellige operationer på data.

1.1 Opret Book-klassen

Lav en Book-klasse med attributterne title, author, publicationYear, pages og rating.

1.2 Datasæt

Opret en samling af Book-objekter. Du kan lave et lille hardcodet datasæt eller læse fra fil/database.

1.3 Stream-behandling

Brug Stream API til følgende operationer på boglisten:

  1. Find gennemsnits-rating for alle bøger.
  2. Filtrér og vis bøger udgivet efter et bestemt år.
  3. Sortér bøger efter rating faldende.
  4. Find og vis titlen på bogen med højest rating.
  5. Gruper bøger efter forfatter og beregn gennemsnits-rating pr. forfatter.
  6. Beregn det samlede sidetal for alle bøger.

Hints

Chaining and Composition

Kæd flere Stream-operationer sammen (filter → sort → map) for at løse komplekse opgaver.

Collecting Results

Brug terminal-operationer som collect, forEach eller reduce til at samle og vise resultater.

Strukturer din kode

Et forenklet skelet kunne se sådan ud:

import java.util.List;

class Book {
    private String title;
    private String author;
    private int publicationYear;
    private double rating;
    private int pages;

    // Constructor, getters og evt. setters
}

public class StreamProcessing {
    public static void main(String[] args) {
        // Opret en liste af bøger
        
        // Beregn gennemsnits-rating
        
        // Filtrér bøger efter år
        
        // Sortér bøger efter rating (faldende)
        
        // Find titlen på bogen med højest rating
        
        // Gruper bøger efter forfatter og beregn gennemsnit
        
        // Beregn samlet sidetal
    }
}

2. Collectors

Introduction

Collectors er hjælpeklassen i java.util.stream, der giver metoder til reduktion og aggregation på streams. Den bruges sammen med Stream API til at samle elementer i lister/sets/maps eller til summering, gruppering, optælling m.m.

Collectors kapsler logikken for opsamling og giver dig kort syntaks til at transformere og aggregere data.

Typiske opgaver med collectors:

Samle elementer i en collection

  • Collectors.toList(): samler til en List.
  • Collectors.toSet(): samler til et Set.
  • Collectors.toCollection(): samler til en specificeret collection-type.

Aggregation og reduktion

  • Collectors.summingInt(), summingLong(), summingDouble(): sum.
  • Collectors.averagingInt(), averagingLong(), averagingDouble(): gennemsnit.
  • Collectors.counting(): optælling.
  • Collectors.maxBy(), minBy(): max/min efter comparator.

Gruppering

Collectors.groupingBy(): grupperer efter classifier og returnerer et map.

Øvelser

2.1 Opret Transaction-klassen

Lav en Transaction-klasse med felter id, amount og currency.

2.2 Datasæt

Opret en samling Transaction-objekter (hardcodet eller læst ind).

2.3 Aggregation med Collectors

Brug Collectors til disse operationer:

  1. Beregn den totale sum af alle beløb.
  2. Gruper transaktioner efter valuta og beregn summen pr. valuta.
  3. Find det højeste beløb.
  4. Find gennemsnitsbeløbet.

2.4 Opsamling af resultater

Brug collect med forskellige collectors til at samle resultaterne.

Et forenklet skelet kunne se sådan ud:

Hints

import java.util.List;

class Transaction {
    private int id;
    private double amount;
    private String currency;

    // constructor, getters
}

public class CollectorsExercise {
    public static void main(String[] args) {
        List<Transaction> transactions = List.of(
            new Transaction(1, 100.0, "USD"),
            new Transaction(2, 150.0, "EUR"),
            new Transaction(3, 200.0, "USD"),
            new Transaction(4, 75.0, "GBP"),
            new Transaction(5, 120.0, "EUR"),
            new Transaction(6, 300.0, "GBP")
        );
        
        // Calculate the total sum of all transaction amounts
        double totalSum = transactions.stream()
                .mapToDouble(Transaction::getAmount)
                .sum();
        System.out.println("Total sum of all transactions: " + totalSum);
        
        // Gruper transaktioner efter valuta og beregn sum pr. valuta
        
        // Find største transaktion
        
        // Find gennemsnitsbeløb
    }
}

3. Bonus øvelse

Forestíl dig en samling af employees med felter name, age, department og salary. Opgaven er at lave forskellige dataanalyser med lambdas og streams.

3.1 Opret Employee-klassen med felterne ovenfor.

3.2 Datasæt: Opret en samling af Employee-objekter (hardcodet eller læst ind).

3.3 Dataanalyse:

Implementér følgende med lambdas/streams:

  1. Beregn gennemsnitsalder.
  2. Find medarbejderen med højest løn.
  3. Gruper efter afdeling og beregn gennemsnitsløn pr. afdeling.
  4. Tæl antal medarbejdere i hver afdeling.
  5. Find de tre ældste medarbejdere.
  6. Filtrér og vis medarbejdere med løn over en given grænse.

3.4 Sortering

Brug sorted til at sortere efter forskellige kriterier som age, salary eller name.