簡體   English   中英

java 8中lambda函數的語法

[英]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));
  }
}

可以在這里找到更多示例:

http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/Lambda-QuickStart/index.html?cid=7180&ssid=105274749521607

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM