Java 8现在具有功能接口,例如ToLongFunction,它将其参数转换为long值.
我看到一个例子如下面的代码:
ToLongFunction<String> i = (x)-> Long.parseLong(x);
System.out.println(i.applyAsLong("2"));
Run Code Online (Sandbox Code Playgroud)
问题是:为什么我要实现一个接口只是为了将一个变量转换为一个基元long,只需要调用方法Long.parseLong(x)就更简单易读了?
简短的回答是你根本不会这样做,你只是Long.parseLong()直接打电话.
更长的答案是你很少ToLongFunction像i上面那样显式地声明类型的显式变量,而是在为接受它们的众多函数之一编写lambda时间接使用函数接口作为目标.
要使用新Stream接口中的示例,您可能需要获取具有如下数值List<String> input的String对象:["123", "456", ...]并将它们全部解析为列表long.
你可以这样做:
long[] result = input.stream().mapToLong( x -> Long.parseLong(x) ).toArray();
Run Code Online (Sandbox Code Playgroud)
在这里你永远不会ToLongFunction直接写,但通过提供lambda方法间接使用它mapToLong(ToLongFunction f),它调用你的Long.parseLong(x)方法.因此,功能界面是帮助实现这一功能的神奇之处.
因此,您将始终间接使用此接口Stream以及Java 8中的其他lambda相关功能,但您可能不会经常显式地使用它(除非您正在编写想要接受此类函数的类).
Java 8现在具有功能接口,例如ToLongFunction,它将其参数转换为long值.
这是一个误解ToLongFunction:它的目的是成为具有原始长输出的任何函数,无论是通过它Long.parseLong还是其他完全不同的函数; 也许是的Person.getIdNumber().
在任何情况下,ToLongFunction除了在编写一个接受 lambda 的方法时,你应该从不引用,除非你想要一个原始long结果.否则,直接写lambda.