JavaRush /Blogue Java /Random-PT /Pausa para café #163. Qual é a diferença entre um lambda ...

Pausa para café #163. Qual é a diferença entre um lambda e uma referência de método. 5 maneiras de concatenar string nula em Java

Publicado no grupo Random-PT

Qual é a diferença entre um lambda e uma referência de método

Fonte: Reddit IntelliJ IDEA sugere substituir expressões lambda por referências de método. Qual a diferença entre eles? Pausa para café #163.  Qual é a diferença entre um lambda e uma referência de método.  5 maneiras de concatenar string nula em Java - 1Acontece que há uma diferença sutil entre expressões lambda e referências de método. Por exemplo, compare: myInstance::getStuff e () ->myInstance.getStuff() . Em geral, ambas as opções são equivalentes entre si. Mas se myInstance for nulo e o lambda produzir um ponteiro nulo ao avaliar o lambda, uma referência de método será gerada imediatamente ao tentar acessar a referência. E o que? Em geral, isso é importante se o código que avalia a expressão lambda estiver dentro de um try-catch com ponteiro nulo. Por exemplo, eu tenho uma função couldBeNull(Supplier<T> function) que faz algo assim:
try {
    doStuff(function.get().getSomeMore().getSomeMore());
} catch (NullPointerException e) {
    doOtherStuff();
}
Se chamar mightBeNull(() -> myNullVariable.getStuff()) funcionaria sem lançar uma exceção, então o “equivalente”: mightBeNull(myNullVariable::getStuff) lançará uma NullPointerException imediatamente quando a função for chamada. Essa é a diferença. Observação. De acordo com Stackoverflow, se você substituir o lambda por uma referência de método, o bytecode da classe será mais compacto, o que significa que a classe será carregada mais rapidamente na JVM. No entanto, para obter tal ganho, são necessários milhares de lambdas não otimizados. Entretanto, em um projeto grande, esse número pode ser facilmente acumulado. Caso contrário, a escolha entre um lambda e uma referência de método é uma questão de gosto e legibilidade do código. Por exemplo, se um lambda tiver várias linhas, a legibilidade será reduzida e o código só será beneficiado se o lambda for colocado em um método separado e uma referência a ele for usada.

5 maneiras de concatenar string nula em Java

Fonte: Gitconnected Depois de ler este post, você aprenderá mais maneiras de trabalhar com strings em Java. Java oferece muitas maneiras de concatenar strings, mas às vezes, quando não prestamos atenção às strings nulas, podemos acabar com null, o que obviamente não é o que queremos. Portanto, use meus métodos recomendados para evitar valores nulos ao concatenar String.

Analise de problemas

Se quisermos concatenar arrays de strings, podemos simplesmente usar o operador +. No entanto, podemos encontrar valores nulos ao fazer isso .
String[] values = {"https", "://", "gist.", "github", ".com", null};
String result = "";

for (String value : values) {
    result = result + value;
}
A combinação de todos esses elementos nos leva a este resultado:
https://gist.github.comnull
Embora tenhamos encontrado o problema, o valor nulo resultante também é concatenado como uma string, o que claramente não é o que esperávamos. E mesmo se estivermos trabalhando em Java 8 ou superior, usando o método estático String.join() para unir strings, ainda assim terminaremos com valores nulos .
String[] values = {"https", "://", "gist.", "github", ".com", null};
String result = String.join("", values);
O resultado é o mesmo:
https://gist.github.comnull
Então, como resolver esse problema? Existem várias soluções. Para facilitar a demonstração do código posteriormente, extraímos um método que pode passar uma string e retornar uma string não nula.
public String nullToString(String value) {
    return value == null ? "" : value;
}

1.String.concat()

String.concat() é um método que vem com a classe String . É muito conveniente para concatenação de strings.
for (String value : values) {
    result = result.concat(getNonNullString(value));
}
Como o método nullToString() é chamado, não há valores nulos como resultado .

2.StringBuilder

A classe StringBuilder fornece muitos métodos úteis e convenientes para construir strings. O mais comumente usado entre eles é o métodoappend() , que usaappend () para concatenar strings e é combinado com o método nullToString() para evitar valores nulos .
String[] values = {"https", "://", "gist.", "github", ".com", null};
StringBuilder result = new StringBuilder();

for (String value : values) {
    result = result.append(nullToString(value));
}
Como resultado, você pode obter o seguinte resultado:
https://gist.github.com

3. Classe StringJoiner (Java 8+)

A classe StringJoiner fornece uma função mais poderosa para unir strings. Ele pode não apenas especificar o delimitador durante a concatenação, mas também especificar o prefixo e o sufixo. Ao concatenar strings, podemos usar seu método add() . O método nullToString() também será usado aqui para evitar valores nulos .
String[] values = {"https", "://", "gist.", "github", ".com", null};
StringJoiner result = new StringJoiner("");

for (String value : values) {
    result = result.add(nullToString(value));
}

4. Streams.filter (Java 8+)

A API Stream é uma poderosa classe de operações de stream introduzida no Java 8 que pode executar filtragem padrão, correspondência, passagem, agrupamento, estatísticas e outras operações.
  • O filtro de operação do filtro pode receber uma função Predicado .
  • A interface da função Predicate é a mesma da interface Function introduzida anteriormente.
  • Esta é uma interface funcional.
  • Pode receber um parâmetro genérico <T> e o valor de retorno é do tipo booleano.
  • O predicado é frequentemente usado para filtrar dados .
Portanto, podemos definir um Predicado para verificar a string nula e passá-la para o método filter() da API Stream. Além disso, você pode usar o método Collectors.joining() para unir as strings não nulas restantes.
String[] values = {"https", "://", "gist.", "github", ".com", null};

String result = Arrays.stream(values)
    .filter(Objects::nonNull)
    .collect(Collectors.joining());

5. Use o operador +

Usar o operador + também pode resolver o problema, mas não é recomendado. Sabemos que String é um objeto imutável. O uso do sinal + geralmente cria um objeto string e cada vez que uma nova string é criada na memória, o consumo de desempenho do uso do sinal + para concatenar strings é muito alto.

Conclusão

Este artigo apresenta vários métodos para concatenar strings e manipular NULLs, nos quais diferentes métodos podem ser adequados para diferentes cenários. A análise mostra que o desempenho do StringBuilder é o melhor. Mas em condições reais, você precisa combinar determinados cenários e então escolher o método com menor perda de desempenho.
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION