AdvanceUtil.java

package com.ambrosiaandrade.pets.service;

import com.ambrosiaandrade.pets.entities.AnimalEntity;
import com.ambrosiaandrade.pets.interfaces.IAnimalMapper;
import com.ambrosiaandrade.pets.models.Animal;
import com.ambrosiaandrade.pets.models.Cat;
import com.ambrosiaandrade.pets.models.Dog;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;
import java.util.concurrent.ThreadLocalRandom;
import java.util.stream.IntStream;

@Component
public class AdvanceUtil {

    private final IAnimalMapper mapper;

    public AdvanceUtil(IAnimalMapper mapper) {
        this.mapper = mapper;
    }

    public List<AnimalEntity> generateAnimalsWithFor(int number) {
        var entities = new ArrayList<AnimalEntity>();
        for (int i = 0; i <= number; i++) {
            entities.add(mapper.toEntity(generateAnimal()));
        }
        return entities;
    }

    public List<AnimalEntity> generateAnimalWithIntStream(int number) {
        return IntStream.rangeClosed(0, number)
                .mapToObj(i -> mapper.toEntity(generateAnimalThreadSafe()))
                .toList();
    }

    public List<AnimalEntity> generateAnimalWithIntStreamAndParallel(int number) {
        return IntStream.rangeClosed(0, number)
                .parallel()
                .mapToObj(i -> mapper.toEntity(generateAnimalThreadSafe()))
                .toList();
    }

    private Animal generateAnimal() {
        Random random = new Random();
        Animal animal = getAnimal(random);
        animal.setName(getAnimalName(random));
        return animal;
    }

    private Animal generateAnimalThreadSafe() {
        ThreadLocalRandom random = ThreadLocalRandom.current();
        Animal animal = getAnimal(random);
        animal.setName(getAnimalName(random));
        return animal;
    }

    private Animal getAnimal(Random random) {
        return switch (random.nextInt(3)) {
            case 0 -> new Cat();
            case 1 -> new Dog();
            default -> new Animal();
        };
    }

    private String getAnimalName(Random random) {
        List<String> names = Arrays.asList("Shadow", "Charlie", "Max", "Coco", "Bailey", "Lucky");
        return names.get(random.nextInt(names.size()));
    }

}