第一个建议是使用 NetBeans,它会教您如何在许多情况下将代码转换为 lambda。在您的特定代码中,您想要转换for (int i = 0;...)
一种循环。在 lambda 世界中,您必须将其表示为列表推导,更具体地说,对于 Java,表示为流转换。所以第一步是获取整数流:
IntStream.range(0, this.N)
然后对每个成员应用一个 lambda 函数:
IntStream.range(0, this.N).forEach(i->System.out.println(f(i)));
替换您的完整方法print_f
如下所示:
public void print_f() {
IntStream.range(0, this.N).forEach(i->System.out.println(f(i)));
}
print_f
但是,在 lambda 的世界中,将其塑造为高阶函数会更自然:
public void print_f(IntConsumer action) {
IntStream.range(0, this.N).forEach(action);
}
现在您的完整程序将如下所示:
import java.util.function.IntConsumer;
import java.util.stream.IntStream;
class Testing {
private int N;
public Testing (int n) {
N = n;
}
private static int f (int x) {
return 2*x;
}
public void print_f(IntConsumer action) {
IntStream.range(0, this.N).forEach(action);
}
public static void main (String[] args) {
int n = 10;
if (args.length == 1)
n = Integer.parseInt(args[0]);
Testing t = new Testing (n);
t.print_f(i->System.out.println(f(i)));
}
}
...好吧,除了一个print_f
方法应该真正进行打印并只接受转换函数,这会将您的代码转换为以下内容:
public void print_f(IntFunction f) {
IntStream.range(0, this.N).forEach(i->System.out.println(f.apply(i)));
}
public static void main (String[] args) {
int n = 10;
if (args.length == 1)
n = Integer.parseInt(args[0]);
Testing t = new Testing (n);
t.print_f(Testing::f);
}
...或者,完全消除该f
方法,
t.print_f(i->2*i);