StreamApi и замена кучи split

 
 
 
Сообщения:23
приветствую
есть строка вида:
str10:str11;str20:str21;str30:str31;str40:str41

чтобы собрать из нее карту мне приходится ее сплитовать по ; т.е.
String[] array1 = str.split(";");

затем перебирая циклом каждый раз сплитовать уже по : т.е.

for (...) {
String[] array2 = array1[...].split(":");
// укладываю содержимое ячеек в карту (Map)
}

как сделать это мракобесие красивее?
есть ли такой вариант для Stream?
спасибо
Изменен:25 июн 2018 14:05
 
 
Сообщения:295
Не знаю, насколько будет понятливее обычных циклов:
String source = "str10:str11;str20:str21;str30:str31;str40:str41";

Pattern.compile(";").splitAsStream(source)
.collect(Collectors.toMap(s -> s.substring(0, s.indexOf(":")), s -> s.substring(s.indexOf(":") + 1, s.length())))
.forEach((k,v) -> System.out.println(k + " : " + v));
Изменен:25 июн 2018 17:44
 
 
Сообщения:23
спасибо, теперь осталось дело за малым - разобрать с укладкой в мапу
благодарю еще раз
 
 
Сообщения:23
Вот так получилось, еще раз спасибо

Map<String, String> map = new HashMap<>();

Pattern.compile(";")
                .splitAsStream(source)
                .collect(Collectors
                                            .toMap(
                                                        s -> s.substring(0, s.indexOf(":")),
                                                        s -> s.substring(s.indexOf(":") + 1, s.length())))
                .forEach((k, v) -> map.put(k, v));

map.forEach((k, v) -> System.out.println(k + " : " + v));
Изменен:11 июл 2018 15:24
 
 
Сообщения:295
Вы делаете лишнее - не надо дополнительно создавать "Map", она уже создаётся:
Map<String,String> map = Pattern.compile(";").splitAsStream(source)
.collect(Collectors.toMap(s -> s.substring(0, s.indexOf(":")), s -> s.substring(s.indexOf(":") + 1, s.length())));

map.forEach((k,v) -> System.out.println(k + " : " + v));
 
 
Сообщения:18
Вот такой вариант может быть нагляднее, учтите, что в строке не должно быть одинаковых ключей.

String source = "str10:str11;str20:str21;str30:str31;str40:str41";

Map<String, String> map = Arrays.stream(source.split(";"))
        .collect(Collectors.toMap(
                pair -> pair.split(":")[0],
                pair -> pair.split(":")[1]));

System.out.println(map);


или так:
String source = "str10:str11;str20:str21;str30:str31;str40:str41";

Map<String, String> map = Arrays.stream(source.split(";"))
        .map(pair -> pair.split(":"))
        .collect(Collectors.toMap(pair -> pair[0], pair -> pair[1]));

System.out.println(map);
Изменен:26 июн 2018 14:05
 
Модераторы:Нет
Сейчас эту тему просматривают:Нет