Flink Java 8文檔

原文鏈接:https://ci.apache.org/projects/flink/flink-docs-release-1.3/dev/java8.html
Java 8
Java 8引入了一些為編碼的快速性和簡潔性而設(shè)計(jì)的特性,其中最重要的就是我們所說的Lambda表達(dá)式,Java 8 也打開了函數(shù)式編程之門虏辫。Lambda表達(dá)式允許以直接的方式來實(shí)現(xiàn)和傳遞函數(shù)志珍,而無需聲明額外的類。
最新版本的Flink支持所有的Java API操作都可以使用Lambda表達(dá)式钝的,這篇文檔展示了如何使用Lambda表達(dá)式以及描述了一些限制,關(guān)于Flink API的概述,請參考編程指南: https://ci.apache.org/projects/flink/flink-docs-release-1.3/dev/api_concepts.html
例子(Examples)
下面的痪寻;例子展示了如何實(shí)現(xiàn)一個(gè)簡單的,內(nèi)部使用Lambda表達(dá)式輸入的map()虽惭。輸入?yún)?shù)i和map函數(shù)的輸出的類型不需要聲明橡类,Java 8的編譯器會(huì)進(jìn)行推斷。

env.fromElements(1, 2, 3)
// returns the squared i
.map(i -> i*i)
.print();

接下來的兩個(gè)例子展示了以Collector作為輸出的兩個(gè)不同的方法實(shí)現(xiàn)芽唇,為了類型安全顾画,函數(shù)如:flatMap()取劫,需要為Collector定義一個(gè)輸出類型(這個(gè)例子中是String),如果Collector的類型不能通過上下文進(jìn)行推斷的話研侣,就要在Lambda表達(dá)式的參數(shù)列表中手動(dòng)聲明谱邪。不然輸出的結(jié)果將會(huì)被當(dāng)做Object 類型,會(huì)導(dǎo)致非預(yù)期的結(jié)果庶诡。

DataSet<Integer> input = env.fromElements(1, 2, 3);

// collector type must be declared
input.flatMap((Integer number, Collector<String> out) -> {
    StringBuilder builder = new StringBuilder();
    for(int i = 0; i < number; i++) {
        builder.append("a");
        out.collect(builder.toString());
    }
})
// returns (on separate lines) "a", "a", "aa", "a", "aa", "aaa"
.print();
DataSet<Integer> input = env.fromElements(1, 2, 3);

// collector type must not be declared, it is inferred from the type of the dataset
DataSet<String> manyALetters = input.flatMap((number, out) -> {
    StringBuilder builder = new StringBuilder();
    for(int i = 0; i < number; i++) {
       builder.append("a");
       out.collect(builder.toString());
    }
});

// returns (on separate lines) "a", "a", "aa", "a", "aa", "aaa"
manyALetters.print();

下面的代碼中顯示了一個(gè)大量使用Lambda表達(dá)式的單詞計(jì)數(shù)器:

DataSet<String> input = env.fromElements("Please count", "the words", "but not this");

// filter out strings that contain "not"
input.filter(line -> !line.contains("not"))
// split each line by space
.map(line -> line.split(" "))
// emit a pair <word,1> for each array element
.flatMap((String[] wordArray, Collector<Tuple2<String, Integer>> out)
    -> Arrays.stream(wordArray).forEach(t -> out.collect(new Tuple2<>(t, 1)))
    )
// group and sum up
.groupBy(0).sum(1)
// print
.print();

編譯器限制(Compiler Limitations)
當(dāng)前惦银,F(xiàn)link僅支持Eclipse Luna 4.4.2及以上版本的Eclipse JDT 編譯器所編譯的Lambda表達(dá)式。只有Eclipse JDT編譯器保留了對于使用整個(gè)Lambda表達(dá)式特性類型安全的泛型信息末誓。其他的編譯器如: OpenJDK和Oracle JDK的javac扯俱,則扔掉了Lambda表達(dá)式的所有泛型參數(shù)。也就意味著作為Lambda函數(shù)輸入的Tuple2<String, Integer>或者 Collector<String>喇澡,在編譯后的.class文件中會(huì)被裁減成Tuple2或者Collector蘸吓,這對于Flink 編譯器來說信息量太少了。
如何用JDT編譯器編譯一個(gè)包含Lambda表達(dá)式的Flink作業(yè)將在下一章節(jié)介紹撩幽。

使用Eclipse JDT編譯器和Maven編譯Flink任務(wù)
如果你Eclipse IDE的話库继,在做了一些配置之后,你就可以在IDE中運(yùn)行和調(diào)試你的Flink代碼窜醉。Eclipse IDE默認(rèn)使用Eclipse JDT編譯器來編譯Java源代碼宪萄,下一章節(jié)我們將描述如何配置Eclipse IDE。
如果你使用的是其他的IDE如:IntelliJ IDE 或者你想用Maven打jar包來發(fā)布到Flink集群中去執(zhí)行榨惰,你需要修改一下你的項(xiàng)目的pom.xml文件拜英,并使用Maven來編譯你的程序。在快速入門部分中包含了Maven的預(yù)配置文件琅催,你可以在新的項(xiàng)目中使用居凶,或者參考這個(gè)文件。如果你想用Java 8的Lambda表達(dá)式的話藤抡,請取消掉quickstart的pom.xml文件中斜線部分的內(nèi)容侠碧。
注意:你可以手動(dòng)將下面的內(nèi)容插入到Maven的pom.xml文件中,Maven將會(huì)使用Eclipse JDT編譯器來編譯:

<!-- put these lines under "project/build/pluginManagement/plugins" of your pom.xml -->

<plugin>
    <!-- Use compiler plugin with tycho as the adapter to the JDT compiler. -->
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
        <source>1.8</source>
        <target>1.8</target>
        <compilerId>jdt</compilerId>
    </configuration>
    <dependencies>
        <!-- This dependency provides the implementation of compiler "jdt": -->
        <dependency>
            <groupId>org.eclipse.tycho</groupId>
            <artifactId>tycho-compiler-jdt</artifactId>
            <version>0.21.0</version>
        </dependency>
    </dependencies>
</plugin>

如果你是用Eclipse來開發(fā)的話缠黍,m2e插件可能會(huì)與上述插入的內(nèi)容沖突弄兜,導(dǎo)致你的pom.xml非法,如果是這樣的話瓷式,請將下面的內(nèi)容插入到pom.xml中:

<!-- put these lines under "project/build/pluginManagement/plugins/plugin[groupId="org.eclipse.m2e", artifactId="lifecycle-mapping"]/configuration/lifecycleMappingMetadata/pluginExecutions" of your pom.xml -->

<pluginExecution>
    <pluginExecutionFilter>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <versionRange>[3.1,)</versionRange>
        <goals>
            <goal>testCompile</goal>
            <goal>compile</goal>
        </goals>
    </pluginExecutionFilter>
    <action>
        <ignore></ignore>
    </action>
</pluginExecution>

在Eclipse IDE中運(yùn)行和調(diào)試代碼
首先替饿,確保你當(dāng)前運(yùn)行的Eclipse IDE是4.4.2以上的版本,同時(shí)確保你的Eclispe IDE安裝了Java 8 的運(yùn)行環(huán)境贸典。(Window -> Preferences -> Java -> Installed JREs)
創(chuàng)建或者導(dǎo)入你的Eclipse工程
如果你用的是Maven视卢,你需要在你的pom.xml文件中修改maven-compiler-plugin的Java版本。否則右鍵點(diǎn)擊你的工程中的JRE System Library選項(xiàng)廊驼,打開Properties窗口來切換成支持Lambda表達(dá)式的Java 8 JRE据过。
Eclipse JDT編譯器需要指定一個(gè)特殊的編譯器標(biāo)識(shí)來存儲(chǔ).class文件的類型信息颊埃。打開你喜歡的文本編輯器JDT中{project directory}/.setting/org.eclipse.jdt.core.prefs文件,添加下面的內(nèi)容:
org.eclipse.jdt.core.compiler.codegen.lambda.genericSignature=generate
如果不著樣做蝶俱,也可以將下面的Java版本屬性修改成1.8及以上版本:

org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
org.eclipse.jdt.core.compiler.compliance=1.8
org.eclipse.jdt.core.compiler.source=1.8

保存好上面的文件后班利,在Eclipse IDE中刷新整個(gè)項(xiàng)目。
如果你用的是Maven的話榨呆,右鍵Eclipse工程罗标,選擇Maven->update Progect …
如果執(zhí)行下面的代碼無任何異常的話,說明你已經(jīng)配置好了一切

final ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
env.fromElements(1, 2, 3).map((in) -> new Tuple1<String>(" " + in)).print();
env.execute();
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末积蜻,一起剝皮案震驚了整個(gè)濱河市闯割,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌竿拆,老刑警劉巖宙拉,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異丙笋,居然都是意外死亡谢澈,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進(jìn)店門御板,熙熙樓的掌柜王于貴愁眉苦臉地迎上來锥忿,“玉大人,你說我怎么就攤上這事怠肋【戴蓿” “怎么了?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵笙各,是天一觀的道長钉答。 經(jīng)常有香客問我,道長杈抢,這世上最難降的妖魔是什么数尿? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮春感,結(jié)果婚禮上砌创,老公的妹妹穿的比我還像新娘虏缸。我一直安慰自己鲫懒,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布刽辙。 她就那樣靜靜地躺著窥岩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪宰缤。 梳的紋絲不亂的頭發(fā)上颂翼,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天晃洒,我揣著相機(jī)與錄音,去河邊找鬼朦乏。 笑死球及,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的呻疹。 我是一名探鬼主播吃引,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼刽锤!你這毒婦竟也來了镊尺?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤并思,失蹤者是張志新(化名)和其女友劉穎庐氮,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體宋彼,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡弄砍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了输涕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片输枯。...
    茶點(diǎn)故事閱讀 39,977評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖占贫,靈堂內(nèi)的尸體忽然破棺而出桃熄,到底是詐尸還是另有隱情,我是刑警寧澤型奥,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布瞳收,位于F島的核電站,受9級特大地震影響厢汹,放射性物質(zhì)發(fā)生泄漏螟深。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一烫葬、第九天 我趴在偏房一處隱蔽的房頂上張望界弧。 院中可真熱鬧,春花似錦搭综、人聲如沸垢箕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽条获。三九已至,卻和暖如春蒋歌,著一層夾襖步出監(jiān)牢的瞬間帅掘,已是汗流浹背委煤。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留修档,地道東北人碧绞。 一個(gè)月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像吱窝,于是被迫代替她去往敵國和親头遭。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內(nèi)容