名詞王国の新政-Java 8のラボランダー表現を解読する

6734 ワード

先日redditでJava 8 M 8 Developer Proviewのバージョンがすでに発表されているのを見ました.ぜひ試してみたいです.Developer PrviewのバージョンはすでにすべてFeatureが完成しました.Java 8の特性はここで見られます.http://openjdk.java.net/projects/jdk8/featuresをクリックしますhttp://jdk8.java.net/download.html.Java 8で最も期待されるのは、lamban表現です.本稿では、lamband表現を体験し、より深い解析を行います.
ダウンロードと設定
Intellij IDEAはJava 8を完璧にサポートしました.まずProject Structureを開き、Projectに新しいJDKルートを設定し、Modules=>Source=>Language Levelを8.0に設定すればいいです.
今はJava 8を使ってプログラムを作成できます.しかし、私たちが楽しく編集し終わったら、高度なラボランダー表現を楽しんで、プログラムを実行したら、ヒントがあります.これはjavaccのバージョンが正しくないので、Commpiler=>Java Copilerでプロジェクトに対応するjavaccバージョンを1.8に選択すればいいです.
なんですか?Eclipseを使うと言いましたか?まだ安定版がないみたいです.新鮮なものを食べたいですが、この住所を見てもいいです.http://stackoverflow.com/questions/13295275/programming-java-8-in-eclipseまずcheckout Eclipse JDTのbeta java 8分岐、そしてEclipseでこのプロジェクトを実行して、java 8をサポートするEclipseを起動します.
体験lamda表現
はい、Java 8の新しい特性を体験してみましょう.今私達の匿名類はこのように書くことができます.

    new Thread(() -> {
        System.out.println("Foo");
    }).start();
前の書き方はこれしかないです.

    new Thread(new Runnable() {
        @Override
        public void run() {
            System.out.println("Foo");
        }
    }).start();
このように見ると、私達は匿名のほうが簡単に書いてあるようです.二つ目の方法は、便利なIDEを使って、効率もあまり変わらないようです.ブロガーも最初はこのように思っていました.よく勉強してから、その中の奥深さが分かりました.
ここに重要な情報があります.java: Compilation failed: internal java compiler errorはここで一つの関数ではなく、一つのオブジェクトを表しています.抽象的かもしれませんが、コードで話しましょう.

public class LambdaTest {

    private static void bar(){
        System.out.println("bar");
    }

    public static void main(String[] args) {
        new Thread(LambdaTest::bar).start();
    }

}
分かりましたか?ここで()->{}は、関数(C++のクラスメートで笑った)を表し、new Thread(Runnable runnable)のパラメータは、パラメータとして関数として受け入れられます.
不思議に思いますが、Javaの思考を覆しましたか?原理を分析する前に、ブロガーはひとまず関所を売って、まず何がlamband表現ですか?
どういう表現ですか?
lamda表現の由来
何かをネチネチと言っていますが、現代のプログラミング言語のlamdba表現は1930年代初めに、阿隆佐・邱奇(Alonzo Church)から提出されたものです.λ演算理論.λ演算の中心となる思想は「万物のすべての関数」です.一つλ演算子は、LambdaTest::barという一般的な形式の関数である.一つλ演算子は別のものとしてもいいです.λ演算子の入力は高次の関数を構築する.λ演算は関数式プログラミングの元祖です.有名なプログラミング言語のLispは基礎です.λ演算して構築する.Lispを使ったことがあるのはすべて明らかで、その文法はとても簡単で、しかし万物を包容する能力があります.
コンピュータをやっているのは邱奇さんにはなじみがないかもしれませんが、邱奇さんと同じ時代の別の人というと、みんな雷のように感じます.邱奇が有名になった時、図霊はまだ大学生だった.邱奇は図霊と一緒に邱奇-図霊論題を発表し、それぞれ提出しました.λ演算と図霊机、コデルが提示した再帰関数を加えて、理論的に計算可能性は何かを確定しました.計算可能性とは何かについては、ブロガーもよく分かりませんが、現代のすべてのコンピュータプログラム言語は、3つのうちの一つから発展したものと考えられます.この点だけは、その影響が深いことからも分かる.当時私達に『計算理論』を教えてくれたのは徳望の高い教授で、宋公と呼ばれています.毎回その輝かしい時代を話します.いつも止まって、一心不乱に「偉大ですね」と感嘆しています.確かに偉大だと思います.人の絵霊大学の時に現代のコンピュータの基礎を打ち立てました.私達はまだDOTAを打っています.
おかみさんたちの写真を添付して、感じてみてください.
名词王国里的新政-解读Java8之lambda表达式_第1张图片
近代的なプログラミング言語の中のlamda表現
もういいです.神は偉大な時代を過ぎました.コードを作るにはどうすればいいですか?
現代語のlamda表現は、いくつかの特徴があります.
  • 関数は入力として機能することができる.
  • 関数は、出力として機能することができる.
  • 関数は関数に作用して高次関数を形成することができる.
  • 関数は、ラグダフォーマットの定義をサポートする.
  • 実は1、2、3というのは流れに乗って船を押すことです.4はあまり必要性がないです.普通の言語は自分の関数定義方式があります.4は補充としてだけです.もちろん4つの言語が実現されました.一般的には「lambada表現が実現したと思います.」と言います.(Java 8とPythonさんにお願いします.)
    Java 8ではlambada表現を使用します.
    Funtional Interface
    Javaの中のlamdaは単独では出現できません.入れ子をするためにインターフェースが必要です.このインターフェースは注釈として@Funtional Interfaceを使用しなければならず、実装されていない方法は一つしかない.インターフェースで未実現の方法は何ですか?インターフェースの中にもう実現した方法がありますか?おめでとうございます.Java 8のインターフェースも書くことができます.実現しました.InterfaceとAbstractClassはもっと間抜けだと思いますか?しかし、AbstractClassは@Functional Interfaceの注釈を使うことができません.公式の解釈はAbstractClassの構造関数を防止するために、いくつかのことをします.
    はい、コードを見てきます.Runnableインターフェースは今このようになりました.
    
    @FunctionalInterface
    public interface Runnable {
        public abstract void run();
    }
    
    ここでは任意のパラメータなしのlamda表現をRunnableに割り当てることができます.
    
        Runnable runnable = () -> {
            System.out.println("Hello lambda!");
        };
        runnable.run();
    
    lamda表現は本質的には関数であるので、より不思議な割当て値を使うこともできます.
    
    public class HelloLambda {
    
        private static void hellolambda() {
            System.out.println("Hello lambda!");
        }
    
        public static void main(String[] args) {
            Runnable runnable = HelloLambda::hellolambda;
            runnable.run();
        }
    }
    
    ここでここを見て、皆さんは大体分かりました.lamband表現はただの看板です.深い意味は、関数はJavaの中で実体として表現できます.これは、Java 8において、関数は関数のパラメータとしてもいいし、関数の戻り値としてもいいです.つまり、lamda演算のすべての特性を持っています.
    FunctionシリーズAPI
    ここを見て、皆さんは疑問があるかもしれませんか?どのような関数とどのようなラボダ表現が同じタイプですか?答えはパラメータと戻り値の種類が関数の種類を決定します.例えば、Runnableのrun方法は、パラメータを受け入れず、値を返してもいない場合、Runnableインターフェースは、パラメータがなく、戻り値がない任意の関数で値を割り当てることができる.このように概念的には、Runnableが表す意味は一つのオブジェクトから一つの方法に変わります.
    この点はJava 8のjava.util.functionパッケージのコードが検証されました.代表的なFunctionインターフェースを例に挙げます.
    
    @FunctionalInterface
    public interface Function<T, R> {
    
        R apply(T t);
    
    }
    
    Functionがあります.このように書いてもいいです.
    
        Function<Integer,String> convert = String::valueOf;
        String s = convert.apply(1);
    
    これはJavascriptの関数の対象に似ていますか?
    残念なことに、ここのFunctionは半製品としてカウントされています.単一のパラメータがあり、非voidの戻り値の関数があります.System.out.println()のように、戻り値がvoidなので、Functionには値しません.
    どうすればいいですか?java.util.functionパッケージはそんなに完璧ではない解決策を提供します.いくつかのFuntional Interfaceを定義します.
    そして、Java 8にあります.
  • Supplier:引数がなく、戻り値の関数
  • だけがあります.
  • Consmer:一つのパラメータ、戻り値はvoidの関数
  • です.
  • BiFunction:2つのパラメータ、1つの戻り値の関数
  • BiConsmer:2つのパラメータは、戻り値の関数
  • がありません.
  • これらのAPIに対して、私もあまりツッコミする力がありません.どうせもっといい方法がないと思います.皆さん、この機会に単語をたくさん勉強してください.
    まとめ:名詞王国の新政
    多くの学生がこの有名な文章を見たことがあると信じています.名詞王国の死刑.この文章はJavaに動詞があることを突っ込みました.Javaにはいつもある名詞(対象/クラス)があります.
    動詞は名詞王国においてようやく一つの身分を持つようになりました.もちろん、この動詞は名詞としての身分を取ってから、正しい言葉で生き延びることができます.幸いにもOracle国王は彼らのためにいくつかの身分(Function、Consmer、Supplier、BiFunction)を残しておいたので、大多数の動詞はすでに自分の位置を見つけました.System.out.printlnはConsmerです.String.valueOfは今Functionです.Collection.sizeはSupplierです.いくつかの長いパラメータの方法のために識別情報を取得するのも容易である(新しいFuntionInterfaceインターフェースを定義する).
    この影響は深いと信じています.例えば、次のセグメントコードは、同じラインコードでListをListに変換することができる.
    
    List<String> strings = intList.stream().map(String::valueOf).collect(Collectors.<String>toList());
    
    もちろん問題もあります.クローズドなどの要素が含まれているため、FuntionInterfaceのプロローグ/反プロローグはかなり複雑なことです.Javaに詳しい開発者は、lambadaの導入によって、いくつかの困惑をもたらします.古くから学ぶということわざがありますが、私はこの新しい機能を気にしないです.
    参考文献:
  • http://blog.sciencenet.cn/blog-414166-628109.html
  • http://www.global-sci.org/mc/issues/3/no2/freepdf/80s.pdf
  • http://en.wikipedia.org/wiki/Lambda_cacacalus
  • このシリーズの文章はまだいくつかの部分が残っています.
    lamda表現とクローズド
    Java 8 lambada表現の原理分析