Как вы конвертируете метод в одну строку в java8 - PullRequest
2 голосов
/ 29 мая 2020

У меня есть следующий метод, который преобразует одну строку в карту

и хочу преобразовать ее в однострочную инструкцию, используя java8

строку, разделенную входным каналом, например: status: MYSTATUS | data1: value1

public Map<String, String> getMap(String attributeUpdate){
    Map<String, String> attr = new HashMap<>();
    if(StringUtils.isNotEmpty(attributeUpdate)){
        List<String> a = Arrays.asList(attributeUpdate.split("\\|"));
        for (String s : a) {
            String[] key_val = s.split(":");
            if(key_val.length == 2) {
                attr.put(key_val[0], key_val[1]);
            }
        }
    }
    return attr;
}

Ответы [ 3 ]

7 голосов
/ 29 мая 2020

Попробуйте следующий код. Работает нормально.

String s = new String("status:MYSTATUS|data1:value1");
Arrays.stream(s.split("\\|")).map(stringArray -> stringArray.split(":"))
        .filter(stringArray -> stringArray.length == 2)
        .collect(Collectors.toMap(stringArray ->stringArray[0], stringArray-> stringArray[1],(oldvalue,newvalue)->newvalue));

Спасибо

3 голосов
/ 29 мая 2020

Вы можете попробовать, как показано ниже,

Arrays.stream(attributeUpdate.split("\\|"))   //convert directly to stream
    .map(e->e.split(":"))
    .filter(e->e.length==2)
    .collect(toMap(s->s[0], s->s[1], (o, n)->n));  // collect map, handle duplicates
2 голосов
/ 29 мая 2020

Вот простое решение:

import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import static org.assertj.core.api.Assertions.assertThat;

public class Test {

    @org.junit.jupiter.api.Test
    public void shouldParseAttributes() throws Exception {
        String attributeUpdate = "status:MYSTATUS|data1:value1";

        Map<String, String> attributes = Stream.of(attributeUpdate.split("\\|"))
            .map(attribute -> attribute.split(":"))
            .collect(Collectors.toMap(
                    attribute -> attribute[0],
                    attribute -> attribute[1]));

        assertThat(attributes).containsEntry("status", "MYSTATUS");
        assertThat(attributes).containsEntry("data1", "value1");
    }
}
...