La Stream API purtroppo non è particolarmente adatta per replicare quello che hai scritto. La Stream API è fatta per operare su collezioni (e in generale su "flussi" di dati) in maniera "funzionale" e dove tipicamente ciascun elemento non ha una correlazione particolare con gli altri o quello precedente/successivo (come invece c'è nelle tue logiche).
E comunque il problema non è tanto l'uso della Stream API ma il fatto che le tue implementazioni sono altamente inefficienti. Perché in particolare hai usato ampiamente la "concatenazione delle stringhe" ( + ), che è inefficiente in scenari come quelli.
La mia implementazione di indexShuffle scritta al volo è questa:
codice:public static String indexShuffle(String str) { char[] chars = str.toCharArray(); char[] buf = new char[str.length()]; int k = 0; for (int i = 0; i < chars.length; i += 2) { buf[k++] = chars[i]; } for (int i = 1; i < chars.length; i += 2) { buf[k++] = chars[i]; } return new String(buf); }
Funzionalmente, funziona come la tua. Ma con una stringa iniziale di 2000 caratteri, la mia è almeno 20 (sì, 20 !) volte più veloce della tua.
E con 40 caratteri è comunque almeno 9 volte più veloce della tua.![]()