inline fun <T, R : Any> Array<out T>.mapNotNull( transform: (T) -> R? ): List<R>Mi caso de uso es un poco diferente a este
¿Hay alguna función que pueda usar en lugar de mapNotNull en Java?
val strings: List<String> = listOf("12a", "45", "", "3") val ints: List<Int> = strings.mapNotNull { it.toIntOrNull() } println(ints) // [45, 3]No hay una solución directa, pero el equivalente del código en Java puede ser:
List<Integer> ints = strings.stream() .filter(s -> s.matches("[0-9]+")) .map(Integer::valueOf) .collect(Collectors.toList());Salidas
[45, 3]De la documentación:
fun String.toIntOrNull(): Int?Analiza la cadena como un número Int y devuelve el
resultonullsi la cadena no es una representación válida de un número.
Entonces, si queremos crear el código exacto en Java, puede usar:
.map(s -> s.matches("[0-9]+") ? Integer.valueOf(s) : null)Y luego:
Devuelve una lista que contiene solo los resultados no nulos de aplicar el determinado
Lo que te lleva a usar en Java:
.filter(Objects::nonNull)su código final debe ser:
List<Integer> ints = strings.stream() .map(s -> s.matches("[0-9]+") ? Integer.valueOf(s) : null) .filter(Objects::nonNull) .collect(Collectors.toList());Pero la primera solución sigue siendo la mejor para su caso.
Scanner es una buena manera de verificar la presencia de números enteros:
List<String> strings = List.of("12a", "45", "", "3"); List<Integer> ints = strings.stream() .filter(it -> new Scanner(it).hasNextInt()) .map(Integer::parseInt) .collect(Collectors.toList()); System.out.println(ints); // [45, 3]