java中mapnotnull(来自kotlin)的最佳替代方法是什么

mtb9vblg  于 2021-07-08  发布在  Java
关注(0)|答案(2)|浏览(536)
inline fun <T, R : Any> Array<out T>.mapNotNull(
    transform: (T) -> R?
): List<R>

我的用例和这个有点不同
在java中有什么函数可以代替mapnotnull吗?

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

println(ints) // [45, 3]
igsr9ssn

igsr9ssn1#

解决方案

没有直接的解决方案,但是java中的代码的等价物可以是:

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

输出

[45, 3]

更多细节

根据文件: fun String.toIntOrNull(): Int? 将字符串解析为整数并返回 result 或者 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());

但第一个解决方案对你的案子来说还是更好的。

i1icjdpr

i1icjdpr2#

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]

相关问题