ラムダ式のjdk8新機能の1つ

入門

(また、JDK 1.8として知られている)は、Java 8は、Java言語のメジャーリリースです。java8新機能は非常に多く、我々これはラムダ式を焦点を当てています。また、Java 8のリリースの中で最も重要な新機能を促進することであるクロージャと呼ばれるラムダ式、。ラムダは、プロセスに渡されたパラメータの関数として、関数のパラメータとしての方法を可能にします。

java8の新機能

  1. ラムダ式のjdk8新機能の1つ
  2. 参照jdk8の方法で2つの新機能
  3. jdk8 3インターフェイスの新しい機能は何です
  4. jdk8 4つのデフォルトの方法の新機能
  5. 新しいjdk8 5ストリームAPIは何ですか
  6. 以下のようなシックス・オプションjdk8新機能
  7. jdk8新機能7 Nashorn JavaScriptを
  8. 新機能jdk8日付と時刻のAPIのうち8
  9. 新しいjdk8 9 Base64では何ですか

文法

完全なラムダ式は、3つの部分から構成されています。パラメータリスト、矢印宣言。

(Type1 param1, Type2 param2, ..., TypeN paramN) -> { statment1; statment2; ...... return statmentM;}

以下は、ラムダ式の重要な機能は次のとおりです。

  • オプションの型宣言:パラメータの型を宣言する必要はありません、コンパイラは識別パラメータ値を統一することができます。(param1,param2, ..., paramN) -> { statment1; statment2; ...... return statmentM;}

  • 括弧内のオプションのパラメータ:括弧内にパラメータを定義する必要はなく、パラメータの数は括弧を定義する必要があります。param1 -> { statment1; statment2; ...... return statmentM;}

  • オプションのブレースは:身体文が含まれている場合、あなたは括弧を使用する必要はありません。(param1,param2, ..., paramN) -> statment1

  • オプションのreturnキーワード:件名が値を返すだけの式の場合、コンパイラが自動的に値を返します、中括弧式が値を返す指定する必要があります。param1 -> statment1

ラムダ式の例

ラムダ式の簡単な例:

// 1. 不需要参数,返回值为 5
() -> 5

// 2. 接收一个参数(数字类型),返回其2倍的值
x -> 2 * x

// 3. 接受2个参数(数字),并返回他们的差值
(x, y) -> x – y

// 4. 接收2个int型整数,返回他们的和
(int x, int y) -> x + y

// 5. 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void)
(String s) -> System.out.print(s)

今、私たちは、Javaコードで実装する必要があります。

package com.adanblog.demo;

/**
 * Lambda表达式例子
 * @author adanblog
 */
public class LambdaTest {
	public static void main(String[] args) {
		// 1. 不需要参数,返回值为 5,() -> 5
		Fun1 f=()->5;
		System.out.println("返回5:"+f.test());

		// 2. 接收一个参数(数字类型),返回其2倍的值
		Fun2 f2=x -> 2 * x;
		System.out.println("5 * 2 = "+f2.test(5));

		// 3. 接受2个参数(数字),并返回他们的差值
		Fun3 f3=(x, y) -> x - y;
		System.out.println("5 - 3 = "+f3.test(5,3));

		// 4. 接收2个int型整数,返回他们的和
		Fun4 f4=(int x, int y) -> x + y;
		System.out.println("5 + 3 = "+f4.test(5,3));

		// 5. 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void)
		Fun5 f5=(String s) -> System.out.print(s);
		f5.test("我们是来参数lamdba");
	}

	interface Fun1 {
	    int test();
	}

	interface Fun2 {
	    int test(int a);
	}

	interface Fun3 {
	    int test(int a,int b);
	}

	interface Fun4 {
	    int test(int a,int b);
	}

	interface Fun5 {
	    void test(String str);
	}
}

主な印刷方法を実行した後:

返回5:5
5 * 2 = 10
5 - 3 = 2
5 + 3 = 8
我们是来参数lamdba

変数のスコープ

ラムダ式は、ローカル変数の定義は、そうでなければ、コンパイルとして知られている、ラムダの域外適用内で変更することができないことを意味外のローカル変数最終マークを参照することができます。コード:

package com.adanblog.demo;

/**
 * Lambda表达式变量作用域例子
 * @author adanblog
 */
public class LambdaTest2 {
	final static String salutation = "Hello! ";
	public static void main(String[] args) {
		GreetingService gs=(mes)->System.out.println(salutation+mes);
		gs.sayMessage("我是Lambda的测试!");
	}

	interface GreetingService {
	    void sayMessage(String message);
	}
}

実行出力:

Hello! 我是Lambda的测试!

また、外側の層に直接lamdba式のローカル変数にアクセスすることができます。

package com.adanblog.demo;

/**
 * Lambda表达式变量作用域例子
 * @author adanblog
 *
 */
public class LambdaTest3 {
	public static void main(String[] args) {
		int num=2;
		Fun c=(par)->System.out.println(String.valueOf(num+par));
		c.test(5);//输出结果为7
	}

	interface Fun{
		 void test(int i);
	}
}

ラムダ式のローカル変数はないかもしれないが、後のコードに変更してはならない(即ち、劣性セマンティック決勝を有する)上記の例では、変数の値はNUMを所与の変化であろう最終として宣言しました

package com.adanblog.demo;

/**
 * Lambda表达式变量作用域例子
 * @author adanblog
 *
 */
public class LambdaTest3 {
	public static void main(String[] args) {
		int num=2;
		Fun c=(par)->System.out.println(String.valueOf(num+par));
		c.test(5);//输出结果为7
		//在这里更改变量值,编译就会报错:Local variable num defined in an enclosing scope must be final or effectively final
		num=5;
	}

	interface Fun{
		 void test(int i);
	}
}

パラメータまたはローカル変数と同じ名前のローカル変数を宣言することが許可されていないラムダ式で。

int num=2;
Fun c=(num)->System.out.println(String.valueOf(num));//编译报错

おすすめ

転載: www.cnblogs.com/adanblog/p/12660360.html