Java 8 introduziu uma nova APIStream que nos permite processar dados de maneira declarativa.
Neste artigo rápido, aprenderíamos como usar a APIStream para dividir umString separado por vírgulas em uma lista deStrings e como juntar uma matrizString em umString separado por vírgula.
Também veremos como converter uma matriz de string para mapear usando a APIStream.
Quase todo o tempo, enfrentamos situações em que precisamos iterar algunsJava Collectionse filtrarCollection com base em alguma lógica de filtragem. Em uma abordagem tradicional para esse tipo de situação, usamos muitos loops e operações if-else para obter o resultado desejado.
Se você quiser ler mais sobre a APIStream, verifiquethis article.
2. Juntando Strings com a APIStream
Vamos usar a APIStream para criar uma função que uniria uma matrizString em umaString separada por vírgulas:
Como podemos ver no métodoCollectors.joining(), estamos declarando nosso prefixo como‘[‘e pós-fixo como‘]'; portanto, oString gerado será criado com o formato[…..] declarado.
3. DividindoStrings com APIStream
Agora, vamos criar uma função, que dividiriaString separados por vírgulas em uma lista deString usando a APIStream:
public static List split(String str){
return Stream.of(str.split(","))
.map (elem -> new String(elem))
.collect(Collectors.toList());
}
Também é possível converter diretamente uma listaString em uma listaCharacter usando a APIStream:
public static List splitToListOfChar(String str) {
return str.chars()
.mapToObj(item -> (char) item)
.collect(Collectors.toList());
}
Um fato interessante a notar aqui é que o métodochars() converte oString em um fluxo deInteger, onde cada valorInteger denota o valorASCII de cada um e cada sequência deChar. É por isso que precisamos digitar explicitamente o objeto mapeador no métodomapToObj().
4. String array paraMap withStream API
Também podemos converter uma matrizString para mapear usandosplit andCollectors.toMap, desde que cada item na matriz contenha uma entidade de valor-chave concatenada por um separador:
Aqui,“:” é o separador de valor-chave para todos os elementos na matriz String.
Please remember that in order to avoid compilation error, we need to ensure that code is compiled using Java 1.8. Para fazer isso, precisamos adicionar o seguinte plug-in nopom.xml:
A seguir, vamos criar outro para testar nossa funcionalidade de divisão simples:
@Test
public void givenString_transformedToStream_convertToList() {
String programmingLanguages = "java,python,nodejs,ruby";
List expectation = new ArrayList<>();
expectation.add("java");
expectation.add("python");
expectation.add("nodejs");
expectation.add("ruby");
List result = JoinerSplitter.split(programmingLanguages);
assertEquals(result, expectation);
}
Finalmente, vamos testar nossa matrizString para mapear a funcionalidade:
@Test
public void givenStringArray_transformedToStream_convertToMap() {
String[] programming_languages = new String[] {"language:java","os:linux","editor:emacs"};
Map expectation=new HashMap<>();
expectation.put("language", "java");
expectation.put("os", "linux");
expectation.put("editor", "emacs");
Map result = JoinerSplitter.arrayToMap(programming_languages);
assertEquals(result, expectation);
}
Da mesma maneira, precisamos criar o restante dos casos de teste.
6. Conclusão
A APIStream nos fornece técnicas sofisticadas de processamento de dados. Essa nova maneira de escrever código é muito eficiente em termos de gerenciamento de memória heap em um ambiente multithread.
Como sempre, o código-fonte completo está disponívelover on Github.