Se o objetivo deste exemplo e pergunta é descobrir como mapear strings para um fluxo de ints (por exemplo, usando um fluxo de ints para acessar um índice em um Array de strings), você também pode usar boxing e, em seguida, lançar para um int (que permitiria acessar o índice do array).
int[] numbers = {0, 1, 2, 3};
String commaSeparatedNumbers = Arrays.stream(numbers)
.boxed()
.map((Integer i) -> Integer.toString((int)i))
.collect(Collectors.joining(", "));
A chamada .boxed () converte seu IntStream (um fluxo de ints primitivos) em um Stream (um fluxo de objetos - ou seja, objetos Integer) que, então, aceitará o retorno de um objeto (neste caso, um objeto String) de seu lambda. Aqui, é apenas uma representação de string do número para fins de demonstração, mas poderia ser tão facilmente (e de forma mais prática) qualquer objeto de string - como o elemento de uma matriz de string, conforme mencionado antes.
Só pensei em oferecer outra possibilidade. Na programação, sempre existem várias maneiras de realizar uma tarefa. Conheça o máximo que puder e, em seguida, escolha aquele que melhor se adapta à tarefa em questão, tendo em mente os problemas de desempenho, intuitividade, clareza de código, suas preferências no estilo de codificação e o que mais se autodocumenta.
Boa codificação!
IntStream
eStream<Integer>
?