Какова лучшая альтернатива mapNotNull (от Kotlin) в Java

#java #kotlin

#java #котлин

Вопрос:

 inline fun <T, R : Any> Array<out T>.mapNotNull(
    transform: (T) -> R?
): List<R>
 

Мой вариант использования немного отличается от этого

Есть ли какая-либо функция, которую я могу использовать вместо mapNotNull в Java?

 val strings: List<String> = listOf("12a", "45", "", "3")
val ints: List<Int> = strings.mapNotNull { it.toIntOrNull() }

println(ints) // [45, 3]
 

Ответ №1:

Решение

Прямого решения нет, но эквивалент кода на Java может быть:

 List<Integer> ints = strings.stream()
        .filter(s -> s.matches("[0-9] "))
        .map(Integer::valueOf)
        .collect(Collectors.toList());
 

Выводит

 [45, 3]
 

Подробнее

Из документации:

fun String.toIntOrNull(): Int?

Анализирует строку как число Int и возвращает result or null , если строка не является допустимым представлением числа.

Итак, если мы хотим создать точный код на Java, вы можете использовать:

 .map(s -> s.matches("[0-9] ") ? Integer.valueOf(s) : null)
 

И затем:

mapNotNull

Возвращает список, содержащий только ненулевые результаты применения данного

Что привело вас к использованию в Java:

 .filter(Objects::nonNull)
 

ваш окончательный код должен быть:

 List<Integer> ints = strings.stream()
        .map(s -> s.matches("[0-9] ") ? Integer.valueOf(s) : null)
        .filter(Objects::nonNull)
        .collect(Collectors.toList());
 

Но первое решение все же лучше для вашего случая.

Ответ №2:

Scanner это хороший способ проверить наличие целых чисел:

 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]