Qual a diferença entre usar o orElse() ou orElseGet() do Optional do Java?
Analisando sua assinatura conseguimos ter uma ideia, mas mesmo assim, pode gerar um pouco de confusão, mas a resposta é bem simples
public T orElse(T other)
public T orElseGet(Supplier<? extends T> other)
O método orElse() recebe um valor qualquer em seu argumento, ou seja, um objeto pronto, já o orElseGet() recebe uma interface funcional, que será executada apenas se seu valor do Optional for vazio (empty).
Se você tiver que executar um método APENAS se seu valor do Optional for vazio, utilize o orElseGet, caso contrário, seu método será sempre executado, já que o orElse recebe um valor concreto.
Sempre utilize o orElseGet caso o retorno que você precise seja algo dinâmico, ou que necessita ser construído apenas naquele momento.
Mas quando usar o orElse? se você tiver uma constante ou um objeto no mesmo escopo com o valor que deve ser retornado no caso do Optional ser vazio o orElse é útil, pois evitaria de criar um objeto a mais (que seria a interface funcional para encapsula-la) sem necessidade.