#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
ornull
, если строка не является допустимым представлением числа.
Итак, если мы хотим создать точный код на Java, вы можете использовать:
.map(s -> s.matches("[0-9] ") ? Integer.valueOf(s) : null)
И затем:
Возвращает список, содержащий только ненулевые результаты применения данного
Что привело вас к использованию в 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]