![](/img/trans.png)
[英]Scope in higher order functions in Java 8 lambda syntax of Combinator Pattern
[英]syntax of lambda functions in java 8
我是java的新手,我不知道如何編寫一個簡單的lambda函數。 我試着閱讀一些文章,比如這篇文章,但我沒有設法編譯,因為我得到語法錯誤。
我希望用λ-function
替換此代碼中的函數F
class Test {
private int N;
public Test (int n) {
N = n;
}
private int f (int x) { /* <== replace this */
return 2*x;
}
public void print_f () {
for (int i = 0; i < this.N; i++)
System.out.println (f(i)); /* <== with lambda here*/
}
public static void main (String[] args) {
int n = 10;
if (args.length == 1)
n = Integer.parseInt(args[0]);
Test t = new Test (n);
t.print_f ();
}
}
編輯 :我的問題只涉及Java中λ函數 的語法 。 不是匿名類的語法。
第一個建議是使用NetBeans,它將教你如何在許多情況下將代碼轉換為lambdas。 在您的特定代碼中,您想要轉換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)));
}
但是,在lambda的世界中,將print_f
為高階函數會更自然:
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);
為了回答我自己的問題,使用Marko Topolnik提供的答案,這里有一個完整的文件Test.java
,它完全按照我的要求,使用Keep It Simple Stupid原理。
在這種情況下,我將函數λ(int) - > int推廣到λ(int,int) - > int 。
可在此處找到所有可定義的函數類型:
http://download.java.net/jdk8/docs/api/java/util/function/package-summary.html
import java.util.function.BiFunction;
class Test {
public static void main (String[] args) {
int n = 10;
if (args.length == 1) n = Integer.parseInt(args[0]);
for (int i=0; i <= n; i++)
System.out.println (((BiFunction<Integer, Integer, Integer>)
(x,y)->2*x+y).apply(i,1));
}
}
可以在這里找到更多示例:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.