ラムダ式
また、閉鎖として知られているラムダ式は、それは、Java 8のリリースの最も重要な新機能を促進することです。
ラムダは、(プロセスに渡されたパラメータとしての機能)メソッドの引数として機能させます。
ラムダ式は、コードの使用は、よりシンプルかつコンパクトになり作ることができます。
構文のコントラスト
ラムダ式の構文は次のとおりです。
(parameters) -> expression
(parameters) ->{ statements; }
重要な機能
- オプションの型宣言:パラメータの型を宣言する必要はありません、コンパイラは識別パラメータ値を統一することができます。
- 括弧内のオプションのパラメータ:括弧内にパラメータを定義する必要はなく、パラメータの数は括弧を定義する必要があります。
- オプションのブレースは:身体文が含まれている場合、あなたは括弧を使用する必要はありません。
- オプションのreturnキーワード:被験者は戻り値、コンパイラが自動的に値を返すことを唯一の表現である場合、中括弧は値を返す明確な式を指定する必要があります。
簡単な例:
// 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)
public class Java8Tester {
public static void main(String args[]){
Java8Tester tester = new Java8Tester();
// 类型声明
MathOperation addition = (int a, int b) -> a + b;
// 不用类型声明
MathOperation subtraction = (a, b) -> a - b;
// 大括号中的返回语句
MathOperation multiplication = (int a, int b) -> { return a * b; };
// 没有大括号及返回语句
MathOperation division = (int a, int b) -> a / b;
System.out.println("10 + 5 = " + tester.operate(10, 5, addition));
System.out.println("10 - 5 = " + tester.operate(10, 5, subtraction));
System.out.println("10 x 5 = " + tester.operate(10, 5, multiplication));
System.out.println("10 / 5 = " + tester.operate(10, 5, division));
// 不用括号
GreetingService greetService1 = message ->
System.out.println("Hello " + message);
// 用括号
GreetingService greetService2 = (message) ->
System.out.println("Hello " + message);
greetService1.sayMessage("Nowcoder");
greetService2.sayMessage("Google");
}
interface MathOperation {
int operation(int a, int b);
}
interface GreetingService {
void sayMessage(String message);
}
private int operate(int a, int b, MathOperation mathOperation){
return mathOperation.operation(a, b);
}
}
执行输出结果:
```java
$ javac Java8Tester.java
$ java Java8Tester
10 + 5 = 15
10 - 5 = 5
10 x 5 = 50
10 / 5 = 2
Hello Nowcoder
Hello Google
変数のスコープ
ラムダ式は、ローカル変数の定義は、ラムダの域外適用内で変更することができないそうでなければ、コンパイルエラーを意味し、外側のローカル変数最終マークを参照することができます。
Java8Tester.javaファイルに次のコードを入力します。
public class Java8Tester {
final static String salutation = "Hello! ";
public static void main(String args[]){
GreetingService greetService1 = message ->
System.out.println(salutation + message);
greetService1.sayMessage("Nowcoder");
}
interface GreetingService {
void sayMessage(String message);
}
}
上記のスクリプトの実装では、出力は次のようになります。
$ javac Java8Tester.java
$ java Java8Tester
Hello! Nowcoder
我々はまた、ラムダ式に直接外層のローカル変数にアクセスすることができます。
public class Java8Tester {
public static void main(String args[]) {
final int num = 1;
Converter<Integer, String> s = (param) -> System.out.println(String.valueOf(param + num));
s.convert(2); // 输出结果为 3
}
public interface Converter<T1, T2> {
void convert(int i);
}
}
ローカル変数のラムダ式は、最終として宣言することはできないが、コードに後で変更されてはならない(即ち、を有する劣性-セマンティック最終)
int num = 1;
Converter<Integer, String> s = (param) -> System.out.println(String.valueOf(param + num));
s.convert(2);
num = 5;
//报错信息:Local variable num defined in an enclosing scope must be final or effectively
final
パラメータまたはローカル変数と同じ名前のローカル変数を宣言することはできませんラムダ式で。
String first = "";
Comparator<String> comparator = (first, second) -> Integer.compare(first.length(), second.length()); //编译会出错