序文
JDK8は、ほぼ4年にリリースされ、現在はその新機能についての話を少し思えた「時代遅れ。」JDK8は、もはや「新」であるが、それは表現--Lambda重要な特性の一つだが、まだほとんどの開発者は、使用堪能されていないが、それはでも、開発者には知られていないされていません。
私たちは皆知っている国内の開発環境会社と新技術のためのプロジェクトチームは、多くの場合、法外である、とさえ今日はまだ開発を投影するJDK6を使用している企業が存在するように、古いプロジェクトのすべての種類は、リスクを幅広く公開し、そこにありますこれは大幅に制限されるので、倍のペースはステップの減少によるプロジェクトであっても、会社の一歩を踏み出す追従できない技術の選択で多くをリードしてきました。
本論文では、簡単に重要な新機能JDK8の1の--Lambda表現を認識しています。JDK8前に、Javaが理解するために、関数型プログラミングいわゆる関数型プログラミングをサポートしていないと、引数として(も「行為」として知られている)の関数です。(振る舞いがパラメータとして渡されます)私たちは、オブジェクト指向プログラミングは、抽象データ(様々なPOJOクラス)で、一般的に、よりオブジェクト指向プログラミングを言及する必要があり、およびプログラミング機能は、抽象的行動であります。JavaScriptでは、これは文法の非常に共通の特徴ですが、Javaでは、それは動作しないことに引数として渡された関数となり、幸いJDK8は、Javaの限界を破るように見えました。
ラムダ式の認知度
まず、私はJDK8 Java環境の下準備文法の伝統的なルールスレッドに合わせて以下に示している場合、IDEAで経験書き込みコードを持っているかどうかわからない、の例を紹介しましょう。
ラムダ式を促すメッセージが表示されますIDEAは、交換可能に使用することができます。
ラムダ式はあなたの代わりに上記の匿名クラスの方法を使用しての使用できる単語を使用する必要があります。
この例では、文法の伝統的な規則は、我々は、Runnableインタフェースを実現し、パラメータとして匿名の内部クラスが渡されており、すなわち、実際に我々は、コードの一部を通過Threadクラスの引数として渡し、私たちは、不必要な多くのもたらしたデータ転送、などのコードを配置し、「定型的なコードを。」
ラムダ式は、3つの部分の合計です。
后面的示例中我们会详解这个结构,包括有无参数,有无返回值的问题。 那么这个看起来奇奇怪怪的不太像Java的语法规则,其本身含义到底什么呢?这也是开始困扰我的问题,什么时候在什么场景下可以使用Lambda表达式。
**能够接收Lambda表达式的参数类型,是一个只包含一个方法的接口。**只包含一个方法的接口称之为“函数接口”。
例如上面创建一个线程的示例,Runnable接口只包含一个方法,所以它被称为“函数接口”,所以它可以使用Lambad表达式来代替匿名内部类。根据这个规则,我们试着来写一个函数接口,并使用Lambda表达式作为参数传递。
测试:
可以看到,只要是一个接口中只包含一个方法,则可以使用Lambda表达式,这样的接口称之为“函数接口”。
上面的函数接口比较简单不包含参数,也不包含返回值。
我们再来修改FunctionInterface函数接口逐步加大Lambda表达式的难度——包含参数,不包含返回值。
测试:
关注Lambda表达式“(x) -> Sysout.out.println(“Hello World” + x)”,左边传递的是参数,此处并没有指明参数类型,因为它可以通过上下文进行类型推导,但在有些情况下不能推导出参数类型(在编译时不能推导通常IDE会提示),此时则需要指明参数类型。我个人建议,任何情况下指明函数的参数类型。
哪种情况不能推导出参数类型呢?就是函数接口是一个泛型的时候。
测试:
上面的示例提到了Lambda表达式的两种情况:
无参数,无返回值;
有参数,无返回值。
接下来就是有参数,有返回值这种较为复杂的情况。
测试:
此时的Lambda表达式“(Integer x) -> true”,右边是表达式的主体,直接返回true,如果有多行代码,则可以直接使用花括号表示,例如:
Lambda表达式基本的语法规则:
无参数,无返回值,() -> System.out.println(“Hello World”);
有参数,无返回值,(x) -> System.out.println(“Hello World” + x);
有参数,有返回值,(x, y) -> x + y。
这三种基本情况已经大致清楚了,特别是需要弄清,什么时候可以使用Lambda表达式代替匿名内部类,也就是Lambda表达式的应用场景是函数接口。Lambda表达式这一新特性在JDK8中的引入,更大的好处则是集合API的更新,新增的Stream类库,使得我们在遍历使用集合时不再像以往那样不断地使用for循环。
JDK8使用集合的正确姿势
示例:计算来自“chengdu”的学生数量有多少。
在JDK8前的代码:
JDK8使用集合的正确姿势:
API的使用“难度”恰似提高了,实际只是不熟悉而已。传统迭代的方式需要阅读完整个循环才能明白代码逻辑,JDK8通过流的方式则可以望文生义且代码量大大减小。
其中最为重要的是——Stream流。Stream的是通过函数式编程方式实现的在集合类上进行复杂操作的工具。若要详细讲解Stream的实现方式我相信再写一篇博客也不为过,所以此处不再考查Stream的内部实现。这里是想告诉大家,如果有幸使用JDK8的开发环境进行开发,尽量学习使用新的集合操作API。
总结
上面对于Lambda表达式以及函数式编程仅仅只是到了一个“认识”的地步,似乎只是感受到了缩小代码量,本文对于Lambda式的认识不深入更多的是对于后面更多的知识做一个铺垫或者作为一个扫盲贴,有关Lambda表达式的应用太多,并发编程、响应式编程等等。如果你有关于Lambda表达式或者函数式编程有更好的见解不妨留下评论。