ラムダ式ラムダ式は、詳細詳細

ラムダ式は、詳細な

 


カテゴリー:  JDKの新機能未定義

 

ラムダについて

ラムダ式のことができ大幅に最適化コードの構造、特に収集や他のコレクションの操作を通じて、JDK8は、Javaコードがよりエレガント書き込み、匿名の内部クラスのほとんどを置き換えることができる新機能です。

JDKはまた私達の使用インターフェイスのための組み込み関数の数を提供し、ラムダ式の製造使用がより便利で効率的です。

インターフェイスの要件

ラムダ式を使用すると、特定のインターフェイスを達成するために単純なことができますが、いないすべてのインターフェイスのラムダ式を使用して実装することができますが。ラムダインターフェイス指定唯一の方法は、実装する必要があるだけでなく、指定されたインターフェイスメソッドを持っています

JDK 8には別の新機能があります。デフォルトは、デフォルトでは修正された方法のデフォルトの実装となり、メソッドが実装されてはならない、それはラムダ式の使用には影響しません。

@FunctionalInterface

機能的なインターフェースの変更、抽象メソッドは、1つのインタフェースだけを必要とします。この注釈は常に一緒にしてラムダ式となります。

ラムダの基本的な文法

ここでは6つのインターフェース、後で詳しく説明するために6つのインターフェースを使用して、すべての操作です。

/**多参数无返回*/
@FunctionalInterface
public interface NoReturnMultiParam { void method(int a, int b); } /**无参无返回值*/ @FunctionalInterface public interface NoReturnNoParam { void method(); } /**一个参数无返回*/ @FunctionalInterface public interface NoReturnOneParam { void method(int a); } /**多个参数有返回值*/ @FunctionalInterface public interface ReturnMultiParam { int method(int a, int b); } /*** 无参有返回*/ @FunctionalInterface public interface ReturnNoParam { int method(); } /**一个参数有返回值*/ @FunctionalInterface public interface ReturnOneParam { int method(int a); } 

()の文法的形態 - > {}、パラメータリストを記述するために使用されている場合は()、{}その方法を説明するために使用され、 - >リードとして(に行く)、ラムダ演算子です。

import lambda.interfaces.*;

public class Test1 { public static void main(String[] args) { //无参无返回 NoReturnNoParam noReturnNoParam = () -> { System.out.println("NoReturnNoParam"); }; noReturnNoParam.method(); //一个参数无返回 NoReturnOneParam noReturnOneParam = (int a) -> { System.out.println("NoReturnOneParam param:" + a); }; noReturnOneParam.method(6); //多个参数无返回 NoReturnMultiParam noReturnMultiParam = (int a, int b) -> { System.out.println("NoReturnMultiParam param:" + "{" + a +"," + + b +"}"); }; noReturnMultiParam.method(6, 8); //无参有返回值 ReturnNoParam returnNoParam = () -> { System.out.print("ReturnNoParam"); return 1; }; int res = returnNoParam.method(); System.out.println("return:" + res); //一个参数有返回值 ReturnOneParam returnOneParam = (int a) -> { System.out.println("ReturnOneParam param:" + a); return 1; }; int res2 = returnOneParam.method(6); System.out.println("return:" + res2); //多个参数有返回值 ReturnMultiParam returnMultiParam = (int a, int b) -> { System.out.println("ReturnMultiParam param:" + "{" + a + "," + b +"}"); return 1; }; int res3 = returnMultiParam.method(6, 8); System.out.println("return:" + res3); } } 

ラムダ簡素化構文

私たちは、より一層エレガントなコードを書くために、次のコードを観察することによって、コードを簡素化するために行うことができます。

 
import lambda.interfaces.*;

public class Test2 { public static void main(String[] args) { //1.简化参数类型,可以不写参数类型,但是必须所有参数都不写 NoReturnMultiParam lamdba1 = (a, b) -> { System.out.println("简化参数类型"); }; lamdba1.method(1, 2); //2.简化参数小括号,如果只有一个参数则可以省略参数小括号 NoReturnOneParam lambda2 = a -> { System.out.println("简化参数小括号"); }; lambda2.method(1); //3.简化方法体大括号,如果方法条只有一条语句,则可以胜率方法体大括号 NoReturnNoParam lambda3 = () -> System.out.println("简化方法体大括号"); lambda3.method(); //4.如果方法体只有一条语句,并且是 return 语句,则可以省略方法体大括号 ReturnOneParam lambda4 = a -> a+3; System.out.println(lambda4.method(5)); ReturnMultiParam lambda5 = (a, b) -> a+b; System.out.println(lambda5.method(1, 1)); } } 

ラムダ式、一般的に使用された例

  • ラムダ式の参照方法

時々、私たちはすぐにすでに達成されている方法に向けインターフェースラムダ式を使用することができ、匿名内部クラスの独自の方法を書き換える必要はありません。

文法

::クラス名の静的メソッド、メソッドを標的にすることによって、共通の所有権belongerメソッド名によって帰属方法

 
public class Exe1 {
    public static void main(String[] args) { ReturnOneParam lambda1 = a -> doubleNum(a); System.out.println(lambda1.method(3)); //lambda2 引用了已经实现的 doubleNum 方法 ReturnOneParam lambda2 = Exe1::doubleNum; System.out.println(lambda2.method(3)); Exe1 exe = new Exe1(); //lambda4 引用了已经实现的 addTwo 方法 ReturnOneParam lambda4 = exe::addTwo; System.out.println(lambda4.method(2)); } /** * 要求 * 1.参数数量和类型要与接口中定义的一致 * 2.返回值类型要与接口中定义的一致 */ public static int doubleNum(int a) { return a * 2; } public int addTwo(int a) { return a + 2; } } 
  • コンストラクタメソッドへの参照

一般的に、我々はクラス名でオブジェクト生成としてインターフェイスを宣言する必要があります::オブジェクトをインスタンス化するための新しい方法を、メソッドが返すオブジェクトを呼び出します。

 
interface ItemCreatorBlankConstruct {
    Item getItem(); } interface ItemCreatorParamContruct { Item getItem(int id, String name, double price); } public class Exe2 { public static void main(String[] args) { ItemCreatorBlankConstruct creator = () -> new Item(); Item item = creator.getItem(); ItemCreatorBlankConstruct creator2 = Item::new; Item item2 = creator2.getItem(); ItemCreatorParamContruct creator3 = Item::new; Item item3 = creator3.getItem(112, "鼠标", 135.99); } } 
  • スレッドを作成するためにラムダ式

匿名内部クラスでrun()メソッドをThreadオブジェクトを作成し、次に書き換えることにより、私たちの前の仕事は、私たちはラムダ式を考える必要がある匿名内部クラスへの参照は、スレッドを作成するプロセスを簡素化するために使用することができます。

 
    Thread t = new Thread(() -> {
      for (int i = 0; i < 10; i++) { System.out.println(2 + ":" + i); } }); t.start(); 
  • コレクションを

当社は、収集呼び出すことができます  public void forEach(Consumer<? super E> action) ラムダ式を横断する方法、コレクション内の要素を。以下は、消費者インターフェースと操作のセットを横断する方法です。消費者インタフェースは、私たちに関数インタフェースのJDKです。

 
    @FunctionalInterface
    public interface Consumer<T> { void accept(T t); //.... } 
 
      ArrayList<Integer> list = new ArrayList<>();

      Collections.addAll(list, 1,2,3,4,5); //lambda表达式 方法引用 list.forEach(System.out::println); list.forEach(element -> { if (element % 2 == 0) { System.out.println(element); } }); 
  • コレクション内の要素を削除するには

我々はpublic boolean removeIf(Predicate<? super E> filter)また、我々が提供するインタフェースの機能である、JDK収集方法、述語の要素を削除するには、準備プロセスを簡素化することができます。

 
      ArrayList<Item> items = new ArrayList<>();
      items.add(new Item(11, "小牙刷", 12.05 )); items.add(new Item(5, "日本马桶盖", 999.05 )); items.add(new Item(7, "格力空调", 888.88 )); items.add(new Item(17, "肥皂", 2.00 )); items.add(new Item(9, "冰箱", 4200.00 )); items.removeIf(ele -> ele.getId() == 7); //通过 foreach 遍历,查看是否已经删除 items.forEach(System.out::println); 
  • 要素のコレクション内の並べ替え

私たちは、セット内の要素をソートすることである前に、コンパレータ匿名内部クラスのオーバーライドを渡し、sortメソッドを呼び出す必要があります方法を比較、我々は今、コードを簡素化するためにラムダ式を使用することができます。

 
        ArrayList<Item> list = new ArrayList<>();
        list.add(new Item(13, "背心", 7.80)); list.add(new Item(11, "半袖", 37.80)); list.add(new Item(14, "风衣", 139.80)); list.add(new Item(12, "秋裤", 55.33)); /* list.sort(new Comparator<Item>() { @Override public int compare(Item o1, Item o2) { return o1.getId() - o2.getId(); } }); */ list.sort((o1, o2) -> o1.getId() - o2.getId()); System.out.println(list); 

クロージャ問題ラムダ式

これは、我々はノートを手放すならば、我々はnumが最終的な値を変更することができない私に教えて、文句を言うだろう、匿名の内部クラスに存在するものです。我々が同定されなかったが、ここでは型numが最終的なものではなく、私たちを助けるための機会は、コンパイル時に仮想キーワードの最終修正を追加します。

 
import java.util.function.Consumer;
public class Main { public static void main(String[] args) { int num = 10; Consumer<String> consumer = ele -> { System.out.println(num); }; //num = num + 2; consumer.accept("hello"); } } 

著者: 海へ

出典:https://www.cnblogs.com/haixiang/p/11029639.html

このサイトの使い方「4.0 BY CCクリエイティブ・コモンズの合意」には、著者とソースの位置を明示記事で再現しました。

 

 
 
 

 

ラムダについて

ラムダ式のことができ大幅に最適化コードの構造、特に収集や他のコレクションの操作を通じて、JDK8は、Javaコードがよりエレガント書き込み、匿名の内部クラスのほとんどを置き換えることができる新機能です。

JDKはまた私達の使用インターフェイスのための組み込み関数の数を提供し、ラムダ式の製造使用がより便利で効率的です。

インターフェイスの要件

ラムダ式を使用すると、特定のインターフェイスを達成するために単純なことができますが、いないすべてのインターフェイスのラムダ式を使用して実装することができますが。ラムダインターフェイス指定唯一の方法は、実装する必要があるだけでなく、指定されたインターフェイスメソッドを持っています

JDK 8には別の新機能があります。デフォルトは、デフォルトでは修正された方法のデフォルトの実装となり、メソッドが実装されてはならない、それはラムダ式の使用には影響しません。

@FunctionalInterface

機能的なインターフェースの変更、抽象メソッドは、1つのインタフェースだけを必要とします。この注釈は常に一緒にしてラムダ式となります。

ラムダの基本的な文法

ここでは6つのインターフェース、後で詳しく説明するために6つのインターフェースを使用して、すべての操作です。

/**多参数无返回*/
@FunctionalInterface
public interface NoReturnMultiParam { void method(int a, int b); } /**无参无返回值*/ @FunctionalInterface public interface NoReturnNoParam { void method(); } /**一个参数无返回*/ @FunctionalInterface public interface NoReturnOneParam { void method(int a); } /**多个参数有返回值*/ @FunctionalInterface public interface ReturnMultiParam { int method(int a, int b); } /*** 无参有返回*/ @FunctionalInterface public interface ReturnNoParam { int method(); } /**一个参数有返回值*/ @FunctionalInterface public interface ReturnOneParam { int method(int a); } 

()の文法的形態 - > {}、パラメータリストを記述するために使用されている場合は()、{}その方法を説明するために使用され、 - >リードとして(に行く)、ラムダ演算子です。

import lambda.interfaces.*;

public class Test1 { public static void main(String[] args) { //无参无返回 NoReturnNoParam noReturnNoParam = () -> { System.out.println("NoReturnNoParam"); }; noReturnNoParam.method(); //一个参数无返回 NoReturnOneParam noReturnOneParam = (int a) -> { System.out.println("NoReturnOneParam param:" + a); }; noReturnOneParam.method(6); //多个参数无返回 NoReturnMultiParam noReturnMultiParam = (int a, int b) -> { System.out.println("NoReturnMultiParam param:" + "{" + a +"," + + b +"}"); }; noReturnMultiParam.method(6, 8); //无参有返回值 ReturnNoParam returnNoParam = () -> { System.out.print("ReturnNoParam"); return 1; }; int res = returnNoParam.method(); System.out.println("return:" + res); //一个参数有返回值 ReturnOneParam returnOneParam = (int a) -> { System.out.println("ReturnOneParam param:" + a); return 1; }; int res2 = returnOneParam.method(6); System.out.println("return:" + res2); //多个参数有返回值 ReturnMultiParam returnMultiParam = (int a, int b) -> { System.out.println("ReturnMultiParam param:" + "{" + a + "," + b +"}"); return 1; }; int res3 = returnMultiParam.method(6, 8); System.out.println("return:" + res3); } } 

ラムダ簡素化構文

私たちは、より一層エレガントなコードを書くために、次のコードを観察することによって、コードを簡素化するために行うことができます。

 
import lambda.interfaces.*;

public class Test2 { public static void main(String[] args) { //1.简化参数类型,可以不写参数类型,但是必须所有参数都不写 NoReturnMultiParam lamdba1 = (a, b) -> { System.out.println("简化参数类型"); }; lamdba1.method(1, 2); //2.简化参数小括号,如果只有一个参数则可以省略参数小括号 NoReturnOneParam lambda2 = a -> { System.out.println("简化参数小括号"); }; lambda2.method(1); //3.简化方法体大括号,如果方法条只有一条语句,则可以胜率方法体大括号 NoReturnNoParam lambda3 = () -> System.out.println("简化方法体大括号"); lambda3.method(); //4.如果方法体只有一条语句,并且是 return 语句,则可以省略方法体大括号 ReturnOneParam lambda4 = a -> a+3; System.out.println(lambda4.method(5)); ReturnMultiParam lambda5 = (a, b) -> a+b; System.out.println(lambda5.method(1, 1)); } } 

ラムダ式、一般的に使用された例

  • ラムダ式の参照方法

時々、私たちはすぐにすでに達成されている方法に向けインターフェースラムダ式を使用することができ、匿名内部クラスの独自の方法を書き換える必要はありません。

文法

::クラス名の静的メソッド、メソッドを標的にすることによって、共通の所有権belongerメソッド名によって帰属方法

 
public class Exe1 {
    public static void main(String[] args) { ReturnOneParam lambda1 = a -> doubleNum(a); System.out.println(lambda1.method(3)); //lambda2 引用了已经实现的 doubleNum 方法 ReturnOneParam lambda2 = Exe1::doubleNum; System.out.println(lambda2.method(3)); Exe1 exe = new Exe1(); //lambda4 引用了已经实现的 addTwo 方法 ReturnOneParam lambda4 = exe::addTwo; System.out.println(lambda4.method(2)); } /** * 要求 * 1.参数数量和类型要与接口中定义的一致 * 2.返回值类型要与接口中定义的一致 */ public static int doubleNum(int a) { return a * 2; } public int addTwo(int a) { return a + 2; } } 
  • コンストラクタメソッドへの参照

一般的に、我々はクラス名でオブジェクト生成としてインターフェイスを宣言する必要があります::オブジェクトをインスタンス化するための新しい方法を、メソッドが返すオブジェクトを呼び出します。

 
interface ItemCreatorBlankConstruct {
    Item getItem(); } interface ItemCreatorParamContruct { Item getItem(int id, String name, double price); } public class Exe2 { public static void main(String[] args) { ItemCreatorBlankConstruct creator = () -> new Item(); Item item = creator.getItem(); ItemCreatorBlankConstruct creator2 = Item::new; Item item2 = creator2.getItem(); ItemCreatorParamContruct creator3 = Item::new; Item item3 = creator3.getItem(112, "鼠标", 135.99); } } 
  • スレッドを作成するためにラムダ式

匿名内部クラスでrun()メソッドをThreadオブジェクトを作成し、次に書き換えることにより、私たちの前の仕事は、私たちはラムダ式を考える必要がある匿名内部クラスへの参照は、スレッドを作成するプロセスを簡素化するために使用することができます。

 
    Thread t = new Thread(() -> {
      for (int i = 0; i < 10; i++) { System.out.println(2 + ":" + i); } }); t.start(); 
  • コレクションを

当社は、収集呼び出すことができます  public void forEach(Consumer<? super E> action) ラムダ式を横断する方法、コレクション内の要素を。以下は、消費者インターフェースと操作のセットを横断する方法です。消費者インタフェースは、私たちに関数インタフェースのJDKです。

 
    @FunctionalInterface
    public interface Consumer<T> { void accept(T t); //.... } 
 
      ArrayList<Integer> list = new ArrayList<>();

      Collections.addAll(list, 1,2,3,4,5); //lambda表达式 方法引用 list.forEach(System.out::println); list.forEach(element -> { if (element % 2 == 0) { System.out.println(element); } }); 
  • コレクション内の要素を削除するには

我々はpublic boolean removeIf(Predicate<? super E> filter)また、我々が提供するインタフェースの機能である、JDK収集方法、述語の要素を削除するには、準備プロセスを簡素化することができます。

 
      ArrayList<Item> items = new ArrayList<>();
      items.add(new Item(11, "小牙刷", 12.05 )); items.add(new Item(5, "日本马桶盖", 999.05 )); items.add(new Item(7, "格力空调", 888.88 )); items.add(new Item(17, "肥皂", 2.00 )); items.add(new Item(9, "冰箱", 4200.00 )); items.removeIf(ele -> ele.getId() == 7); //通过 foreach 遍历,查看是否已经删除 items.forEach(System.out::println); 
  • 要素のコレクション内の並べ替え

私たちは、セット内の要素をソートすることである前に、コンパレータ匿名内部クラスのオーバーライドを渡し、sortメソッドを呼び出す必要があります方法を比較、我々は今、コードを簡素化するためにラムダ式を使用することができます。

 
        ArrayList<Item> list = new ArrayList<>();
        list.add(new Item(13, "背心", 7.80)); list.add(new Item(11, "半袖", 37.80)); list.add(new Item(14, "风衣", 139.80)); list.add(new Item(12, "秋裤", 55.33)); /* list.sort(new Comparator<Item>() { @Override public int compare(Item o1, Item o2) { return o1.getId() - o2.getId(); } }); */ list.sort((o1, o2) -> o1.getId() - o2.getId()); System.out.println(list); 

クロージャ問題ラムダ式

これは、我々はノートを手放すならば、我々はnumが最終的な値を変更することができない私に教えて、文句を言うだろう、匿名の内部クラスに存在するものです。我々が同定されなかったが、ここでは型numが最終的なものではなく、私たちを助けるための機会は、コンパイル時に仮想キーワードの最終修正を追加します。

 
import java.util.function.Consumer;
public class Main { public static void main(String[] args) { int num = 10; Consumer<String> consumer = ele -> { System.out.println(num); }; //num = num + 2; consumer.accept("hello"); } } 

おすすめ

転載: www.cnblogs.com/lqmblog/p/12551254.html