Java Stream API で foldLeft/foldRight で宿題にした StackOverflow しない実装の一例です。
面白ポイントとしては、foldRight
/foldLeft
の実装差分は Function::compose
/Function::andThen
が Endo::compose
/Endo::andThen
に変わっただけ、という所ですね。
(注意)ただしこれは不変な List の concat を Stream を使って実装しているため、非常に遅いです。 高速な実装については読者への宿題とします。