Я просматривал какой-то код и наткнулся на этот метод, который принимает значение заголовка HTML (то есть Content-Disposition = inline; filename = foo.bar) и анализирует его на карте, разделенной точкой с запятой на ключ = значение пар. Сначала это выглядело как хороший кандидат на оптимизацию с использованием потока, но после того, как я его реализовал, тот факт, что я не могу повторно использовать вычисленное значение String.indexOf('='), означает, что строка должна сканироваться 3 раза, что фактически менее оптимальным, чем оригинал. Я прекрасно понимаю, что существует много случаев, когда Streams не являются подходящим инструментом для этой работы, но мне было интересно, не пропустил ли я какой-либо метод, который мог бы позволить Stream быть более результативным или более эффективным, чем исходный код.
/**
* Convert a Header Value String into a Map
*
* @param value The Header Value
* @return The data Map
*/
private static Map<String,String> headerMap (String value) {
int eq;
Map<String,String> map = new HashMap<>();
for(String entry : value.split(";")) {
if((eq = entry.indexOf('=')) != -1) {
map.put(entry.substring(0,eq),entry.substring(eq + 1));
}
}
return map;
return Stream.of(value.split(";")).filter(entry -> entry.indexOf('=') != -1).collect(Collectors.));
} //headerMap
Моя попытка потоковой передачи:
/**
* Convert a Header Value String into a Map
*
* @param value The Header Value
* @return The data Map
*/
private static Map<String,String> headerMap (String value) {
return Stream.of(value.split(";")).filter(entry -> entry.indexOf('=') != -1).collect(Collectors.toMap(entry -> entry.substring(0,entry.indexOf('=')),entry -> entry.substring(entry.substring(entry.indexOf('=') + 1))));
} //headerMap