Alguém sabe como pegar os valores dos produtos numa arraylist e fazer uma média desses valores?

Eu sei que tenho que fazer uma variável pra armazenar esses valores porém eu não consigo pegar na lista

double soma = 0;
for (Produto produto : listaDeProdutos) {
    soma += produto.getValor();
}
double media = soma / (double) listaDeProdutos.size();

Tá deu certo, mas aí eu quero pegar o menor valor dos produtos e o maior

double soma = 0.0;
//calculando a média dos valores
for (Produtos produtos : p) {
soma += produtos.getValor();
}
double media = soma / (double) p.size();

            System.out.println("Valor mínimo: R$ "+ " Valor máximo: R$ "+   " Valor médio: R$ "+ media); 

o valor médio já foi, agr eu queria fazer algo perecido com isso, só que com o valor menor e o maior

Ué, cria uma variável para o maior valor e outra pro menor, dentro do laço você vai comparando o valor atual da iteração.

Outra alternativa utilizando a API Streams.

        List<Produto> produtos = Arrays.asList(new Produto(10), new Produto(15), new Produto(8), new Produto(120), new Produto(100));
        
        // media
        OptionalDouble media = produtos.stream().mapToDouble(Produto::getValor).average();
        if (media.isPresent()) {
            System.out.println(media.getAsDouble());
        }
        
        // menor
        OptionalDouble min = produtos.stream().mapToDouble(Produto::getValor).min();
        if (min.isPresent()) {
            System.out.println(min.getAsDouble());
        }
        
        // maior
        OptionalDouble max = produtos.stream().mapToDouble(Produto::getValor).max();
        if (max.isPresent()) {
            System.out.println(max.getAsDouble());
        }

thanks for the awesome information.