JavaRush /Blog Java /Random-ES /Pausa para el café #163. ¿Cuál es la diferencia entre una...

Pausa para el café #163. ¿Cuál es la diferencia entre una lambda y una referencia de método? 5 formas de concatenar cadenas nulas en Java

Publicado en el grupo Random-ES

¿Cuál es la diferencia entre una lambda y una referencia de método?

Fuente: Reddit IntelliJ IDEA sugiere reemplazar expresiones lambda con referencias de métodos. ¿Cuál es la diferencia entre ellos? Pausa para el café #163.  ¿Cuál es la diferencia entre una lambda y una referencia de método?  5 formas de concatenar cadenas nulas en Java - 1Resulta que existe una diferencia sutil entre las expresiones lambda y las referencias a métodos. Por ejemplo, compare: myInstance::getStuff y () ->myInstance.getStuff() . En general, ambas opciones son equivalentes entre sí. Pero si myInstance es nulo y lambda produce un puntero nulo al evaluarla, entonces se generará una referencia de método inmediatamente al intentar acceder a la referencia. ¿Y qué? En general, esto es importante si el código que evalúa la expresión lambda está dentro de un try-catch con un puntero nulo. Por ejemplo, tengo una función mightBeNull(Proveedor<T> función) que hace algo como esto:
try {
    doStuff(function.get().getSomeMore().getSomeMore());
} catch (NullPointerException e) {
    doOtherStuff();
}
Si llamar a mightBeNull(() -> myNullVariable.getStuff()) funcionaría sin generar una excepción, entonces el "equivalente": mightBeNull(myNullVariable::getStuff) generará una NullPointerException inmediatamente cuando se llame a la función. Esa es la diferencia. Nota. Según Stackoverflow, si reemplaza la lambda con una referencia de método, el código de bytes de la clase será más compacto, lo que significa que la clase se cargará más rápido en la JVM. Sin embargo, para poder experimentar tal ganancia, se necesitan miles de lambdas no optimizadas. Sin embargo, en un proyecto grande, ese número se puede acumular fácilmente. De lo contrario, la elección entre una lambda y una referencia de método es una cuestión de gusto y legibilidad del código. Por ejemplo, si una lambda tiene varias líneas, la legibilidad se reduce y el código solo se beneficiará si la lambda se coloca en un método separado y se utiliza una referencia a ella.

5 formas de concatenar cadenas nulas en Java

Fuente: Gitconnected Después de leer esta publicación, aprenderá más formas de trabajar con cadenas en Java. Java proporciona muchas formas de concatenar cadenas, pero a veces, cuando no prestamos atención a las cadenas nulas, podemos terminar con cadenas nulas, que obviamente no es lo que queremos. Así que utilice mis métodos recomendados para evitar valores nulos al concatenar cadenas.

Análisis del problema

Si queremos concatenar matrices de cadenas, simplemente podemos usar el operador +. Sin embargo, podemos encontrarnos con valores nulos al hacer esto .
String[] values = {"https", "://", "gist.", "github", ".com", null};
String result = "";

for (String value : values) {
    result = result + value;
}
Combinando todos estos elementos nos lleva a este resultado:
https://gist.github.comnull
Aunque encontramos el problema, el valor nulo resultante también se concatena como una cadena, lo que claramente no es lo que esperábamos. E incluso si estamos trabajando en Java 8 o superior, usando el método estático String.join() para unir cadenas, terminaremos con valores nulos .
String[] values = {"https", "://", "gist.", "github", ".com", null};
String result = String.join("", values);
El resultado es el mismo:
https://gist.github.comnull
Entonces, ¿cómo solucionar este problema? Hay varias soluciones. Para que sea más fácil demostrar el código más adelante, extraemos un método que puede pasar una cadena y devolver una cadena no nula.
public String nullToString(String value) {
    return value == null ? "" : value;
}

1. Cadena.concat()

String.concat() es un método que viene con la clase String . Es muy conveniente para la concatenación de cadenas.
for (String value : values) {
    result = result.concat(getNonNullString(value));
}
Debido a que se llama al método nullToString() , no hay valores nulos como resultado .

2.Constructor de cadenas

La clase StringBuilder proporciona muchos métodos útiles y convenientes para construir cadenas. El más utilizado entre ellos es el método append() , que utiliza append() para concatenar cadenas y se combina con el 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, puede obtener el siguiente resultado:
https://gist.github.com

3. Clase StringJoiner (Java 8+)

La clase StringJoiner proporciona una función más potente para unir cadenas. No solo puede especificar el delimitador durante la concatenación, sino también el prefijo y el sufijo. Al concatenar cadenas, podemos usar su método add() . El método nullToString() también se utilizará aquí 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. Filtro de corrientes (Java 8+)

Stream API es una potente clase de operaciones de flujo introducida en Java 8 que puede realizar filtrado, coincidencia, recorrido, agrupación, estadísticas y otras operaciones estándar.
  • El filtro de operación de filtro puede recibir una función de predicado .
  • La interfaz de la función Predicado es la misma que la interfaz de Función presentada anteriormente.
  • Esta es una interfaz funcional.
  • Puede tomar un parámetro genérico <T> y el valor de retorno es de tipo booleano.
  • El predicado se utiliza a menudo para filtrar datos .
Entonces podemos definir un Predicado para verificar si hay una cadena nula y pasarla al método filter() desde Stream API. Además, puede utilizar el método Collectors.joining() para unir las cadenas no nulas restantes.
String[] values = {"https", "://", "gist.", "github", ".com", null};

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

5. Utilice el operador +

Usar el operador + también puede resolver el problema, pero no se recomienda. Sabemos que String es un objeto inmutable. El uso del signo + a menudo crea un objeto de cadena, y cada vez se crea una nueva cadena en la memoria, por lo que el consumo de rendimiento al usar el signo + para concatenar cadenas es muy alto.

Conclusión

Este artículo presenta varios métodos para concatenar cadenas y manejar NULL, en los que diferentes métodos pueden ser adecuados para diferentes escenarios. El análisis muestra que el rendimiento de StringBuilder es el mejor. Pero en condiciones reales, es necesario combinar ciertos escenarios y luego elegir el método con la menor pérdida de rendimiento.
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION