亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Java8vs.Scala之Lambda表達式

2019-11-14 14:56:30
字體:
來源:轉載
供稿:網友

Hussachai Puripunpinyo認為java是一門靜態的強類型語言,因此雖然在Java 8 中函數已經成了一等公民,可以作為函數的參數或者返回值來傳遞,但是它必須要有一個類型,那就是接口,而Lambda表達式就是實現了Functional接口的對象。雖然開發人員不需要為函數對象的創建而擔心,因為編譯器會做這些事情,但是Java并沒有Scala那么出色的類型推理機制,在Java中聲明Lambda表達式必須要指定目標類型??紤]到Java必須維持向后兼容性,這樣做也是可以讓人接受和理解的,事實上在兼容性方面Java已經做的足夠好了,例如Thread.stop()在JDK 1.0中就已經有了,雖然被標記為“已廢棄”數十年,但是現在依然存在,因而不應該因為其他語言有更好的語法就期望Java快速地改變自己的語法。

為了支持Lambda表達式Java引入了函數式接口,該接口只有一個抽象方法。@FunctionalInterface是一個注解,用來表明被注解的接口是一個函數式接口,該注解是可選的,只有需要對接口是否符合契約做檢查的時候才需要使用。

在Java中,Lambda表達式必須要有一個類型,而且類型必須有且僅有一個抽象方法,而大部分已有的回調接口已經滿足這一需求,因此用戶不需要對它們做出任何改變就能夠重用這些接口。例如:

//在Java 8之前Runnable r = new Runnable(){    public void run(){        System.out.PRintln(“This should be run in another thread”);    }};//Java 8Runnable r = () -> System.out.println(“This should be run in another thread”);

對于有一個參數并且有返回值的函數,Java 8提供了一組通用的函數式接口,這些接口在java.util.function包中,使用方式如下:

//Java 8Function<string, integer=""> parseInt = (String s) -> Integer.parseInt(s);

因為參數類型可以從Function對象的類型聲明中推斷出來,所以類型和小括號都可以省略:

//Java 8Function<string, integer=""> parseInt = s -> Integer.parseInt(s);

對于需要兩個參數的函數,Java 8提供了BiFunction:

//Java 8BiFunction<integer, integer="" integer,=""> multiplier =   (i1, i2) -> i1 * i2; //you can’t omit parenthesis here!

對于需要3個及以上參數的接口,Java 8并沒有提供相應的TriFunction、QuadFunction等定義,但是用戶可以定義自己的TriFunction,如下:

//Java 8@FunctionalInterfaceinterface TriFunction<a, r="" c,="" b,=""> {    public R apply(A a, B b, C c);}

在引入了之前定義好的接口之后就可以這樣聲明Lambda表達式:

//Java 8TriFunction<integer, integer="" integer,=""> sumOfThree   = (i1, i2, i3) -> i1 + i2 + i3;

對于語言的設計者為什么會止步于BiFunction,Hussachai Puripunpinyo認為TriFunction、QuadFunction等需要更多參數的接口需要太多的類型聲明,接口的定義變得非常長,同時又怎么決定定義到哪一個才最合適呢,總不能一直定義到包含9個參數和一個返回值類型的EnnFunction吧!

以上示例顯示參數越多,類型定義越冗長,甚至可能整整一行都是類型聲明,那么必須要聲明類型么?答案是在Java中必須如此,但是在Scala中就簡單的多了。

Scala也是一門靜態強類型的語言,但是它從誕生開始就是一門函數式語言,完美融合了面向對象范式和函數式語言范式。Scala中的Lambda表達式也有一個類型,但是語言的設計者采用了數字而不是拉丁語來命名,Scala為開發者提供了0到22個參數的接口定義(Function0、Function1、… Function22),如果需要更多的參數,那么或許是開發者在設計上就存在問題。在Scala中Function的類型是特性(trait),類似于Java中的抽象類。

Scala中的Runnable示例與Java中的實現方式不同:

//ScalaFuture(println{“This should be run in another thread”})//以上代碼等同于//Java 8//assume that you have instantiated ExecutorService beforehand.Runnable r = () -> System.out.println(“This should be run in another thread”);executorService.submit(r);

在Scala中聲明一個Lambda表達式不必像Java那樣必須顯式指定類型,而且方式也有很多:

//Java 8Function<string, integer=""> parseInt = s -> Integer.parseInt(s);//Scalaval parseInt = (s: String) => s.toInt//orval parseInt:String => Int = s => s.toInt//orval parseInt:Function1[String, Int] = s => s.toInt

如果需要更多的參數:

//Java 8PentFunction<integer, integer="" integer,=""> sumOfFive   = (i1, i2, i3, i4, i5) -> i1 + i2 + i3 + i4 + i5;//Scalaval sumOfFive = (i1: Int, i2: Int, i3: Int, i4: Int, i5: Int) =>   i1 + i2 + i3 + i4 + i5;

可以看到,Scala的語法更簡潔,可讀性更好,開發者不需要聲明接口類型,通過參數列表中的類型就能看出對象的類型。

//Java 8PentFunction<string, integer,="" string="" string,="" boolean,="" double,="">   sumOfFive = (i1, i2, i3, i4, i5) -> i1 + i2 + i3 + i4 + i5;//Scalaval sumOfFive = (i1: String, i2: Int, i3: Double, i4: Boolean, i5: String) => i1 + i2 + i3 + i4 + i5;

對于上面這段代碼,開發者一打眼就能看出i3是Double類型的,但是在Java 8中開發者必須要數一數才能看出來,如果要在Java 8中達到這種效果,那只有從格式上來做文章了:

//Java 8 PentFunction sumOfFive = (Integer i1, String i2, Integer i3, Double i4, Boolean i5) -> i1 + i2 + i3 + i4 + i5;

但是這真是非常糟糕,開發者必須一次次地鍵入類型,另外,Java 8并沒有定義PentFunction,你還必須自己定義:

//Java 8@FunctionalInterfaceinterface PentFunction<a, r="" c,="" b,="" e,="" d,=""> {    public R apply(A a, B b, C c, D d, E e);}

Hussachai Puripunpinyo認為Scala在函數式方面做的更好,一方面是因為Scala本身就是一門函數式語言,另一方面是因為Java語言的設計者在引入新東西的時候必須要考慮兼容性,因而有很多約束。但是即使如此,Java 8依然引入了一些非??岬奶匦?,例如方法引用,該特性就能夠讓Lambda表達式的聲明更加簡短:

//Java 8Function<string, integer=""> parseInt = s -> Integer.parseInt(s);//使用方法引用可以簡寫為://Java 8Function<string, integer=""> parseInt = Integer::parseInt;

在Java 8中,方法引用的構建規則有3種:

  1. (args) -> ClassName.staticMethod(args);
    可以重寫為ClassName::staticMethod;
    Function<integer, string=""> intToStr = String::valueOf;
  2. (instance, args) -> instance.instanceMethod(args);
    可以重寫為ClassName::instanceMethod;
    BiFunction<string, integer="" string,=""> indexOf = String::indexOf;
  3. (args) -> expression.instanceMethod(args);
    可以重寫為expression::instanceMethod;
    Function<string, integer=""> indexOf = new String()::indexOf;

流API就大量使用了這種語法來簡化代碼的編寫:

pets.stream().map(Pet::getName).collect(toList());// The signature of map() function can be derived as//  Stream map(Function mapper)

前兩天在一群里看見有人推薦一個app叫問啊,就可以發題答題那種的,感覺就跟uber滴滴打車似的,一般這種軟件一上來就砸錢給紅包啥的,哥之前刷過uber的單有經驗!試驗了幾次應該可以刷,把注冊紅包和之前領的紅包錢套現,目前我提了五十多,目測還能刷更多。ps,但是盡量要問技術相關的問題,不然容易被封。

  有技術的可以自己試,不會的可以q我QQ群290551701


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国精产品一区一区三区有限在线| 日韩免费观看网站| 亚洲欧美制服第一页| 亚洲精品98久久久久久中文字幕| 欧美日韩亚洲一区二| 久久久免费观看视频| 欧美疯狂做受xxxx高潮| 在线观看日韩av| 亚洲91精品在线| 亚洲最大福利视频网站| 日本久久久久久久久| 亚洲第一页中文字幕| 久久久久国产一区二区三区| 欧美国产第二页| 亚洲精品一区在线观看香蕉| 欧美日韩亚洲精品一区二区三区| 国产一区二区三区久久精品| 久久久久久久久中文字幕| 久久久伊人日本| 欧美日韩国产中文精品字幕自在自线| 欧美激情视频一区二区| 亚洲午夜未满十八勿入免费观看全集| 清纯唯美亚洲激情| 欧美色道久久88综合亚洲精品| 在线观看久久av| 欧美午夜激情小视频| 丝袜情趣国产精品| 欧美一区二区影院| 91久久国产婷婷一区二区| 91精品国产高清自在线看超| 国产亚洲成精品久久| 北条麻妃一区二区三区中文字幕| 日韩中文字幕免费视频| 久久天天躁狠狠躁老女人| 中文字幕精品在线| 日韩中文字幕精品视频| 在线观看日韩专区| 亚洲人成网7777777国产| 久久99热这里只有精品国产| 亚洲视屏在线播放| 精品久久久香蕉免费精品视频| 国产91露脸中文字幕在线| 欧美激情喷水视频| 久久久久久久亚洲精品| 国产欧美日韩高清| 精品视频久久久| 欧美在线观看一区二区三区| 一本大道香蕉久在线播放29| 一区二区欧美日韩视频| 成人精品视频在线| 国外成人在线视频| 国产亚洲精品美女久久久久| 欧美日韩一区二区免费在线观看| 2019中文在线观看| 日韩av在线网址| 亚洲免费av电影| 激情亚洲一区二区三区四区| 55夜色66夜色国产精品视频| 国产精品久久久久久久久久久久久| 欧美午夜视频一区二区| 欧美资源在线观看| 成人在线免费观看视视频| 秋霞av国产精品一区| 国产精品美女主播| 国产91色在线|免| 国产成人亚洲综合青青| 国产美女直播视频一区| 日韩中文字幕精品| 91在线观看免费高清| 国产精品9999| 国产欧美一区二区三区在线| 国产不卡视频在线| 欧美性xxxxxx| 亚洲性生活视频在线观看| 欧美区二区三区| 日韩电影中文字幕在线观看| 久久夜色精品国产亚洲aⅴ| 国产精品扒开腿做爽爽爽男男| 日韩av电影在线免费播放| xx视频.9999.com| 中文字幕日韩在线观看| 国产免费一区视频观看免费| 久久久www成人免费精品张筱雨| 欧美日韩亚洲高清| 日韩网站免费观看| 欧美电影在线免费观看网站| 九九久久久久99精品| 最新中文字幕亚洲| 国产精品福利小视频| 日韩av在线播放资源| 亚洲高清福利视频| 少妇高潮久久久久久潘金莲| 亚洲欧美日韩国产精品| 一本一本久久a久久精品综合小说| 欧美在线免费视频| 高清一区二区三区四区五区| 欧美日韩加勒比精品一区| 日韩精品有码在线观看| 国产精品嫩草影院久久久| 久久久精品在线| 国产精品成人久久久久| 一本色道久久88亚洲综合88| 国内精品久久久久久中文字幕| 国产成+人+综合+亚洲欧美丁香花| y97精品国产97久久久久久| 亚洲高清久久久久久| 欧美日韩国产一区二区三区| 色悠悠久久久久| 欧美高清视频在线播放| 日韩在线观看免费全| 日韩经典一区二区三区| 精品女厕一区二区三区| 国产69精品久久久久99| 久久久久五月天| 国产99视频在线观看| 久久久免费观看| 亚洲一二三在线| 欧美超级免费视 在线| 欧美日韩国产色| 亚洲精品一区av在线播放| 一本一道久久a久久精品逆3p| 亚洲国产欧美精品| 国产精品视频久久| 亚洲尤物视频网| 日韩av在线免费播放| 国产日韩欧美在线播放| 韩剧1988在线观看免费完整版| 国产精品吹潮在线观看| 国产精品直播网红| 狠狠躁夜夜躁人人爽超碰91| 国产98色在线| 亚洲日韩欧美视频一区| 欧美日韩中文在线| 亚洲免费视频在线观看| 精品久久久久久中文字幕大豆网| 亚洲欧美日韩一区二区在线| 欧美极品少妇xxxxⅹ免费视频| 亚洲伊人久久大香线蕉av| 欧美性20hd另类| 亚洲性69xxxbbb| 日韩欧美国产中文字幕| 91精品国产乱码久久久久久久久| 国产精品久久久久久久久久小说| 久久久在线视频| 亚洲国产毛片完整版| 国产亚洲精品成人av久久ww| 欧美大片网站在线观看| 久久精视频免费在线久久完整在线看| 国产mv久久久| 在线日韩欧美视频| 97人洗澡人人免费公开视频碰碰碰| 亚洲精品国产综合区久久久久久久| 国产精品第一页在线| 亚洲电影天堂av| 亚洲男人天堂手机在线| 按摩亚洲人久久| 伦伦影院午夜日韩欧美限制| 97国产真实伦对白精彩视频8| 日本高清+成人网在线观看| 97久久精品人人澡人人爽缅北| 69久久夜色精品国产7777| 亚洲资源在线看| 精品国产视频在线| 日韩www在线|