AppliedFunctionnalExamples.java

package fr.univtln.bruno.samples.java101.tp3.functional;

import fr.univtln.bruno.samples.java101.tp3.Person;
import lombok.extern.slf4j.Slf4j;

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

/**
 * Applied functional examples that operate on collections using the Stream API.
 *
 * <p>These examples were moved from other TP3 subpackages to centralize all
 * functional idioms in the `functional` package.</p>
 */
@Slf4j
public class AppliedFunctionnalExamples {

  /**
   * Private constructor to prevent instantiation.
   */
  private AppliedFunctionnalExamples() {
    // utility class
  }

  /**
   * Demonstrate mapping and collecting on a list of Person instances.
   */
  public static void listStreamsExample() {
    log.info("=== List stream mapping example ===");
    List<Person> people = List.of(
      Person.of("Charlie", "Brown", 35),
      Person.of("Alice", "Smith", 30),
      Person.of("Bob", "Jones", 25)
    );
    log.info("Original names: {}", people.stream().map(Person::getFullName).toList());
    log.info("Names with ages: {}", people.stream().map(p -> p.getFullName() + "(" + p.age() + ")").toList());
  }

  /**
   * Demonstrate streaming over grouped values (e.g. after a grouping operation) to extract names.
   */
  public static void mapStreamGroupingExample() {
    log.info("=== Map grouping stream example ===");
    List<Person> people = List.of(
      Person.of("Alice", "Smith", 30),
      Person.of("Bob", "Jones", 25),
      Person.of("Charlie", "Brown", 35),
      Person.of("David", "Smith", 40)
    );
    Map<String, List<Person>> byLast = people.stream().collect(Collectors.groupingBy(Person::lastName));
    byLast.forEach((ln, ps) -> log.info("{} -> {}", ln, ps.stream().map(Person::getFullName).toList()));
  }

  /**
   * Runner for applied functional examples.
   *
   * @param args ignored
   */
  public static void main(String[] args) {
    listStreamsExample();
    mapStreamGroupingExample();
  }
}