2017-01-05 5 views
3

Я хочу разбить нижнюю строку и сохранить ее в HashMap.разделите строку и сохраните ее в HashMap java 8

String responseString = "name~peter-add~mumbai-md~v-refNo~"; 

сначала я разделить строку с помощью разделителя дефис (-) и сохранение его в ArrayList, как показано ниже:

public static List<String> getTokenizeString(String delimitedString, char separator) { 
    final Splitter splitter = Splitter.on(separator).trimResults(); 
    final Iterable<String> tokens = splitter.split(delimitedString); 
    final List<String> tokenList = new ArrayList<String>(); 
    for(String token: tokens){ 
     tokenList.add(token); 
    } 
    return tokenList; 
} 
List<String> list = MyClass.getTokenizeString(responseString, "-"); 

, а затем, используя код, приведенный ниже, чтобы преобразовать его в HashMap, используя поток.

HashMap<String, String> = list.stream() 
          .collect(Collectors.toMap(k ->k.split("~")[0], v -> v.split("~")[1])); 

Сборщик потоков не работает, поскольку нет никакой ценности против refNo.

Он работает правильно, если у меня есть даже количество элементов в ArrayList.

Есть ли способ справиться с этим? Также предлагаю, как я могу использовать поток для выполнения этих двух задач (я не хочу использовать метод getTokenizeString()) с использованием потока java 8.

ответ

6

Если Splitter не делает никакой магии, метод getTokenizeString является устаревшим здесь. Вы можете выполнить всю обработку в одной операции:

Map<String,String> map = Pattern.compile("\\s*-\\s*") 
    .splitAsStream(responseString.trim()) 
    .map(s -> s.split("~", 2)) 
    .collect(Collectors.toMap(a -> a[0], a -> a.length>1? a[1]: "")); 

Используя регулярные выражения \s*-\s* в качестве разделителя, вы рассматриваете Пробельный как часть сепаратора, следовательно, неявно подрезку записи. Перед обработкой записей выполняется только одна начальная операция trim, чтобы гарантировать отсутствие пробела перед первой или после последней записи.

Затем просто разделите записи на этапе map перед входом в Map.

+0

Большое спасибо за ваш быстрый и рабочий ответ. Работаю как шарм. –

2

Прежде всего, вам не нужно дважды разделять то же самое String.
Во-вторых, проверьте длину массива, чтобы определить, присутствует ли значение для заданного ключа.

HashMap<String, String> = 
    list.stream() 
     .map(s -> s.split("~")) 
     .collect(Collectors.toMap(a -> a[0], a -> a.length > 1 ? a[1] : "")); 

Это предполагает, что вы хотите поместить ключ со значением null, если ключ не имеет соответствующее значение.

Или вы можете пропустить переменную list:

HashMap<String, String> = 
    MyClass.getTokenizeString(responseString, "-") 
     .stream() 
     .map(s -> s.split("~")) 
     .collect(Collectors.toMap(a -> a[0], a -> a.length > 1 ? a[1] : "")); 
+0

Спасибо за ваш быстрый ответ. кажется, что он будет расколоться только на ~, а не на дефис. а также Как я могу избавиться от первого метода getTokenizeString(). –

+0

Я пробовал свой код. Он бросает NullPointerException. он работает только для определенного размера. –

+1

@SangamBelose Этот код предполагает, что вы сохраняете 'List list = MyClass.getTokenizeString (responseString," - ");' – Eran

 Смежные вопросы

  • Нет связанных вопросов^_^