Gostei demais da iniciativa!
Porém meu instinto otimizador chamou muito a atenção nesse método: .collect();
.
O Problema
Lendo a documentação do Args pode se ler o seguinte:
An iterator over the arguments of a process, yielding a String value for each argument.
E na documentação do método:
Transforms an iterator into a collection.
Um Iterador permite você percorrer do início ao final, sem poder acessar os elementos intermediários aleatóriamente. Que é exatamente a operação que você está fazendo.
A única vantagem de ter uma coleção (não todas) é justamente poder acessar qualquer elemento em qualquer ordem, o que você não está fazendo em nenhum momento.
O maior problema explicado:
O que acontece se você usar o seu comando com um arquivo de log de 1GB? Para cada palavra o método collect vai inserir em uma nova coleção, aumentando significativamente o uso de memória, sem falar na performance, para criar uma coleção pesadíssima sem toda essa necessidade.
Recomendo usar o iterator diretamente pelo método next()
Segunda evolução:
O que acontece se você usar o seu comando com um arquivo de log de 1GB?
rodando no terminal echo teste.txt
todo o conteúdo desse arquivo é jogado na tela. Numa segunda versão seria interessante implementar essa funcionalidade