JAva 8の最も重要な新しい特性lambda式

12041 ワード

Lambda式はJava 8のリリースを推進する最も重要な新しい特性です.Lambdaは、関数をメソッドのパラメータ(関数をパラメータとしてメソッドに渡す)として許可します.Lambda式を使用すると、コードをより簡潔でコンパクトにすることができます.
Lambda式とは?
Lambdaは匿名の関数で、Lambda式を伝達可能なコード(コードをデータのように伝達する)と理解することができます.より簡潔で柔軟なコードを書くことができます.よりコンパクトなコードスタイルとして、Javaの言語表現能力を向上させた.
1.匿名の内部クラスの代替
Lambda式が最も多く用いられる場合は匿名内部クラスの代わりになり,Runnableインタフェースを実現することは匿名内部クラスの古典的な例である.Lambda式の機能はかなり強く、()->で匿名の内部クラス全体に代わることができます.コードは次のとおりです.匿名の内部クラスを使用します.
    public void testRunable() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("        ");
            }
        }).start();
    }

Lambda式を使用するには:
public void runable() {
        new Thread(() -> System.out.println("lambda 666")).start();
    }

最後の実行結果
        
lambda 666

Lambda式牛Xのところは、ごくわずかなコードで以前のクラスでやったことを完成させたことです!
2.lambda式反復集合
JAvaの集合クラスは私たちの日常開発の過程でよく使われています.私たちのチームの集合クラスの最も一般的な操作は反復的に遍歴しています.次のコードはjava 8の前後を比較しました.
    public void forTest() {
        List languages = Arrays.asList("java","scala","python");
        //java8     
        for(String each:languages) {
            System.out.println(each);
        }
        //java8    
        languages.forEach(x -> System.out.println(x));
        languages.forEach(System.out::println);
    }

とても便利だと言えますが、ここではscalaの文法について、勉強しなければなりません.
3.lambda実装map
JAva 8の新しい特性streamは、別のドキュメントでその使い方を詳しく記録します.map関数は関数式プログラミングで最も重要な方法です.mapの役割は、あるオブジェクトを別のものに変換することです.ここで例を見てみましょう.
    public void mapTest() {
        List cost = Arrays.asList(10.0, 20.0,30.0);
        cost.stream().map(x -> x + x*0.05).forEach(x -> System.out.println(x));
    }

4.lambdaはmapとreduceを実現する
reduceは、streamのドキュメントを参照して、すべての値を1つにまとめるか、Streamにまとめるかを実現します.まず、サイクルで実現する方法を見てみましょう.
    public void sumTest() {
        List cost = Arrays.asList(10.0, 20.0,30.0);
        double sum = 0;
        for(double each:cost) {
            each += each * 0.05;
            sum += each;
        }
        System.out.println(sum);
    }

lambda式で実装します.
    public void mapReduceTest() {
        List cost = Arrays.asList(10.0, 20.0,30.0);
        double allCost = cost.stream().map(x -> x+x*0.05).reduce((sum,x) -> sum + x).get();
        System.out.println(allCost);
    }

出力結果は
63.0

Lambda+map+reduceはあまり優雅ではありません.
5.lambdaのfilter操作
フィルタ操作により元のセットから要素をフィルタします.
    public void filterTest() {
        List cost = Arrays.asList(10.0, 20.0,30.0,40.0);
        List filteredCost = cost.stream().filter(x -> x > 25.0).collect(Collectors.toList());
        filteredCost.forEach(x -> System.out.println(x));

    }

出力結果:
30.0
40.0

6.関数インタフェースPredicate
Predicate関数もJAVA 8の重要な新しい特性の一つです.Predicateインタフェースはフィルタリングに非常に適しています.
    public static void filterTest(List languages, Predicate condition) {
        languages.stream().filter(x -> condition.test(x)).forEach(x -> System.out.println(x + " "));
    }

     public static void main(String[] args) {
        List languages = Arrays.asList("Java","Python","scala","Shell","R");
        System.out.println("Language starts with J: ");
        filterTest(languages,x -> x.startsWith("J"));
        System.out.println("
Language ends with a: "
); filterTest(languages,x -> x.endsWith("a")); System.out.println("
All languages: "
); filterTest(languages,x -> true); System.out.println("
No languages: "
); filterTest(languages,x -> false); System.out.println("
Language length bigger three: "
); filterTest(languages,x -> x.length() > 4); }

出力結果:
Language starts with J: 
Java 

Language ends with a: 
Java 
scala 

All languages: 
Java 
Python 
scala 
Shell 
R 

No languages: 

Language length bigger three: 
Python 
scala 
Shell

Lambdaの書き方と注意事項のまとめ
Lambda式はJava言語に新しい構文要素とオペレータを導入した.このオペレータはLambdaオペレータまたはクリップオペレータと呼ばれる「->」です.Lambdaを2つの部分に分けます.左側:Lambda式に必要なすべてのパラメータを指定します.右側:Lambda体、すなわちLambda式が実行する機能を指定します.
構文フォーマット1:パラメータなし、戻り値なし、Lambdaは1つの文しか必要ありません
Runnable runnable = () -> System.out.println("lamda");

構文フォーマット2:Lambdaには1つのパラメータしか必要ありません
Consumer consumer=(x)->System.out.println(x);

構文3:Lambdaが1つのパラメータしか必要としない場合、パラメータの括弧は省略できます.
Consumer consumer=x->System.out.println(x);

構文フォーマット4:Lambdaには2つのパラメータが必要です
Comparator<Integer> comparator = (x, y) -> Integer.compare(x, y);

構文5:Lambdaに文が1つしかない場合、returnと括弧は省略できます.
inaryOperator binaryOperator=(x,y)->(x+y);

構文フォーマット6:コンパイラによって推定されるため、データ型は省略できます.これを「タイプ推定」と呼びます.
BinaryOperator bo=(x,y)->{
System.out.println("Lambda");
return x+y;};

タイプ推定
Lambda式のパラメータタイプは、コンパイラによって推定されます.Lambda式ではタイプを指定する必要はなく、javacがプログラムのコンテキストに基づいてバックグラウンドでパラメータのタイプを推定したため、プログラムはコンパイルできます.Lambda式のタイプはコンテキスト環境に依存し,コンパイラによって推定される.これがいわゆる「タイプ推定」です.