Java 8的ToLongFunction在什么情况下使用?

4

Java 8现在具有函数式接口,例如ToLongFunction,它将其参数转换为长整型数值。

我看到了一个示例,代码如下:

ToLongFunction<String> i  = (x)-> Long.parseLong(x);

System.out.println(i.applyAsLong("2"));

问题是:为什么要实现一个接口来将变量转换为原始的long类型,而更简单和易读的方法不是直接调用Long.parseLong(x)方法呢?

1
它用于表示匿名函数。如果您有一个高阶函数,需要接受一个函数作为参数,并且该函数必须将其参数转换为long类型,则可以将传递的函数类型设置为 ToLongFunction - Carcigenicate
不要这样做。如果任何值为null,它会导致NPE,因为Java无法自动取消包装null值。应该使用Long而不是原始类型。 - spyro
2个回答

6
短答案是,在这种情况下,您会直接调用Long.parseLong()而不是显式地声明ToLongFunction类型的变量(例如上面的i)。
更长的回答是,您很少会明确声明ToLongFunction类型的显示变量,而是在编写使用它们的许多函数之一的lambda时间接使用函数式接口作为目标。
以新的Stream界面为例,您可能希望获取一个包含数字值的String对象列表(例如["123", "456", ...]),并将其全部解析为一个long类型的列表。
您可以使用以下代码实现:
long[] result = input.stream().mapToLong( x -> Long.parseLong(x) ).toArray(); 

在这里,你并没有直接使用 ToLongFunction ,而是通过向 mapToLong(ToLongFunction f) 提供一个 lambda 方法来间接使用它,这个方法调用了你的 Long.parseLong(x) 方法。所以函数式接口是帮助实现这一点的关键。
因此,在 Java 8 中,你将经常使用这个接口的间接方式,以及其他与 lambda 相关的特性,但你可能不经常显式地使用它(除非你正在编写想要“接受”这样一个函数的类)。

2
在第一句话中,我认为你的意思是使用parseLong而不是parseInt。 - Nick Vanderhoven

5
Java 8现在具有功能性接口,例如ToLongFunction,它将其参数转换为长整型值。然而,这是对ToLongFunction的误解:它旨在成为任何具有原始长输出的函数,无论是通过Long.parseLong还是其他完全不同的函数获得;也许是Person.getIdNumber()。
无论如何,除非您正在编写一个要求使用lambda具有基本long结果的方法,否则基本上永远不应引用ToLongFunction。否则,只需直接编写lambda即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接