日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

java - 匿名內部類中的this,如何在lambda中獲得?

瀏覽:161日期:2023-10-28 18:33:27

問題描述

nsv_productdetail.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() {int bottomMargin = ((ViewGroup.MarginLayoutParams) nsv_productdetail.getLayoutParams()).bottomMargin;nsv_productdetail.getViewTreeObserver().removeOnGlobalLayoutListener(this); }});

上方代碼要是轉換成lambda時,this就會指向外部類,這時候就不能移除監聽了。所以我想請問下,匿名內部類(可以轉換為lambda的匿名內部類),如何在lambda中獲得其本身?

問題解答

回答1:

取代某些匿名內部類本節將介紹如何使用Lambda表達式簡化匿名內部類的書寫,但Lambda表達式并不能取代所有的匿名內部類,只能用來取代函數接口(Functional Interface)的簡寫。先別在乎細節,看幾個例子再說。

例子1:無參函數的簡寫如果需要新建一個線程,一種常見的寫法是這樣:

// JDK7 匿名內部類寫法new Thread(new Runnable(){// 接口名

@Overridepublic void run(){// 方法名 System.out.println('Thread run()');}

}).start();上述代碼給Tread類傳遞了一個匿名的Runnable對象,重載Runnable接口的run()方法來實現相應邏輯。這是JDK7以及之前的常見寫法。匿名內部類省去了為類起名字的煩惱,但還是不夠簡化,在Java 8中可以簡化為如下形式:

// JDK8 Lambda表達式寫法new Thread(

() -> System.out.println('Thread run()')// 省略接口名和方法名

).start();上述代碼跟匿名內部類的作用是一樣的,但比匿名內部類更進一步。這里連接口名和函數名都一同省掉了,寫起來更加神清氣爽。如果函數體有多行,可以用大括號括起來,就像這樣:

// JDK8 Lambda表達式代碼塊寫法new Thread(

() -> {System.out.print('Hello');System.out.println(' Hoolee'); }

).start();例子2:帶參函數的簡寫如果要給一個字符串列表通過自定義比較器,按照字符串長度進行排序,Java 7的書寫形式如下:

// JDK7 匿名內部類寫法List<String> list = Arrays.asList('I', 'love', 'you', 'too');Collections.sort(list, new Comparator<String>(){// 接口名

@Overridepublic int compare(String s1, String s2){// 方法名 if(s1 == null)return -1; if(s2 == null)return 1; return s1.length()-s2.length();}

});上述代碼通過內部類重載了Comparator接口的compare()方法,實現比較邏輯。采用Lambda表達式可簡寫如下:

// JDK8 Lambda表達式寫法List<String> list = Arrays.asList('I', 'love', 'you', 'too');Collections.sort(list, (s1, s2) ->{// 省略參數表的類型

if(s1 == null) return -1;if(s2 == null) return 1;return s1.length()-s2.length();

});上述代碼跟匿名內部類的作用是一樣的。除了省略了接口名和方法名,代碼中把參數表的類型也省略了。這得益于javac的類型推斷機制,編譯器能夠根據上下文信息推斷出參數的類型,當然也有推斷失敗的時候,這時就需要手動指明參數類型了。注意,Java是強類型語言,每個變量和對象都必需有明確的類型。

簡寫的依據也許你已經想到了,能夠使用Lambda的依據是必須有相應的函數接口(函數接口,是指內部只有一個抽象方法的接口)。這一點跟Java是強類型語言吻合,也就是說你并不能在代碼的任何地方任性的寫Lambda表達式。實際上Lambda的類型就是對應函數接口的類型。Lambda表達式另一個依據是類型推斷機制,在上下文信息足夠的情況下,編譯器可以推斷出參數表的類型,而不需要顯式指名。Lambda表達更多合法的書寫形式如下:

// Lambda表達式的書寫形式Runnable run = () -> System.out.println('Hello World');// 1ActionListener listener = event -> System.out.println('button clicked');// 2Runnable multiLine = () -> {// 3 代碼塊

System.out.print('Hello');System.out.println(' Hoolee');

};BinaryOperator<Long> add = (Long x, Long y) -> x + y;// 4BinaryOperator<Long> addImplicit = (x, y) -> x + y;// 5 類型推斷上述代碼中,1展示了無參函數的簡寫;2處展示了有參函數的簡寫,以及類型推斷機制;3是代碼塊的寫法;4和5再次展示了類型推斷機制。

自定義函數接口自定義函數接口很容易,只需要編寫一個只有一個抽象方法的接口即可。

// 自定義函數接口@FunctionalInterfacepublic interface ConsumerInterface<T>{

void accept(T t);

}上面代碼中的@FunctionalInterface是可選的,但加上該標注編譯器會幫你檢查接口是否符合函數接口規范。就像加入@Override標注會檢查是否重載了函數一樣。

有了上述接口定義,就可以寫出類似如下的代碼:

ConsumerInterface<String> consumer = str -> System.out.println(str);

進一步的,還可以這樣使用:

class MyStream<T>{

private List<T> list;...public void myForEach(ConsumerInterface<T> consumer){// 1 for(T t : list){consumer.accept(t); }}

}MyStream<String> stream = new MyStream<String>();stream.myForEach(str -> System.out.println(str));// 使用自定義函數接口書寫Lambda表達式

回答2:

做不到的,Lambda本身不是對象。

標簽: java
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美日韩在线网站| 激情婷婷亚洲| 91欧美极品| 国产精品三级| 日韩88av| 国产精品成人a在线观看| 日韩成人精品一区二区| 亚洲www免费| 午夜一区在线| 国产精品亲子伦av一区二区三区 | 欧美/亚洲一区| 亚洲丝袜啪啪| 美女毛片一区二区三区四区最新中文字幕亚洲| 麻豆一区二区三区| 欧美搞黄网站| 国产欧美在线观看免费| 福利片在线一区二区| 香蕉久久精品| 欧美日韩伊人| 伊人精品一区| 久久影院资源站| 丝袜美腿一区二区三区| 国产黄色一区| 欧美精品激情| 国产福利片在线观看| 首页亚洲欧美制服丝腿| 国产精品久久久久久av公交车| 欧美福利专区| 日本在线高清| 国产精品网在线观看| 亚洲一区二区三区无吗| 黄色在线网站噜噜噜| 日韩福利视频网| 国产一区白浆| 99久久九九| 亚洲精品88| 国产精品sss在线观看av| 国产精品美女| 日韩欧美精品综合| 国产精品sm| 国产欧美一区二区三区国产幕精品 | 国产一区二区三区久久| 免费黄网站欧美| 国产99久久久国产精品成人免费| 国产精品男女| 日韩欧美中文字幕一区二区三区 | 欧美午夜三级| 日本aⅴ亚洲精品中文乱码| 亚洲一区网站| 欧美日韩日本国产亚洲在线| 婷婷成人在线| av免费不卡国产观看| jizzjizz中国精品麻豆| 日韩啪啪电影网| 激情自拍一区| 国产一级久久| 日韩va欧美va亚洲va久久| 欧美一级二级三级视频| 国产精久久久| 天堂中文在线播放| 99久久亚洲精品| 国产精品普通话对白| 亚洲日本欧美| 久久99久久久精品欧美| 欧美综合社区国产| 欧美精品国产| 国产精品1区在线| 欧美日韩视频网站| 亚洲一区免费| 欧美a级一区二区| 欧美精品资源| 一区二区电影在线观看| 国产精品入口久久| 日韩不卡免费高清视频| 美女尤物久久精品| 久久国产日韩欧美精品| 国产欧美一区二区精品久久久| 四虎国产精品免费观看| 久久中文视频| 国产精品自拍区| 国产精品99一区二区| 亚洲欧美日韩精品一区二区 | 国精品一区二区| 欧美日韩一区二区三区不卡视频| av在线资源| 日本国产欧美| 国产99亚洲| 免费视频一区二区三区在线观看| 日韩电影二区| 日本不卡一二三区黄网| 亚洲1234区| 国产精品videossex| 久久一二三区| 日韩精品欧美激情一区二区| 亚洲一区二区三区久久久| 粉嫩av一区二区三区四区五区 | 久久亚洲成人| 免费精品一区| 97久久超碰| 夜久久久久久| 亲子伦视频一区二区三区| 日本亚洲三级在线| 欧美成a人国产精品高清乱码在线观看片在线观看久 | 色综合视频一区二区三区日韩| 国产精品久久久久蜜臀| 亚洲精品系列| 黄页网站一区| 性欧美videohd高精| 狠狠久久伊人| 另类综合日韩欧美亚洲| 日韩国产在线一| 视频一区二区欧美| 麻豆国产欧美日韩综合精品二区| 亚洲欧美日韩一区在线观看| 久久精品播放| 国精品产品一区| 国内精品亚洲| 国产精品嫩草影院在线看| 91免费精品国偷自产在线在线| 亚洲一区有码| 91精品国产经典在线观看| 在线观看亚洲精品福利片| 免费欧美在线视频| 免费精品视频在线| 免费在线欧美视频| 男人操女人的视频在线观看欧美| 狠狠干成人综合网| 美女福利一区二区三区| 日韩成人综合| 亚洲成人免费| 美国av一区二区| 91大神在线观看线路一区| 国产精品日本一区二区三区在线| 精品无人区麻豆乱码久久久 | 国产精品免费大片| 青青青免费在线视频| 免费观看久久av| 亚洲另类黄色| 精品国产亚洲一区二区三区大结局| 福利在线一区| 国产尤物精品| 综合激情网...| 久久亚洲黄色| 免费视频亚洲| 国产三级精品三级在线观看国产| 久久91视频| 黄色亚洲精品| 精品久久国产一区| 亚洲激情五月| 免费视频一区二区三区在线观看 | 亚洲免费观看高清完整版在线观| 国产精品欧美大片| 香蕉人人精品| 蘑菇福利视频一区播放| 国产欧美日韩一区二区三区四区 | 久久精品亚洲一区二区| 国产韩日影视精品| 国产欧美二区| 天堂资源在线亚洲| 国产欧美日韩影院| 婷婷亚洲综合| 麻豆一区在线| 日韩av一区二区在线影视| 欧美三区四区| 日韩精品久久理论片| 久久男人天堂| 欧美日本久久| 亚洲一区二区三区中文字幕在线观看| 国产精品地址| 婷婷亚洲精品| 欧美/亚洲一区| 麻豆精品新av中文字幕| 亚洲免费毛片| 国产模特精品视频久久久久| 91看片一区| 国产欧美一区二区三区精品酒店| 日韩精品国产欧美| 亚洲日本免费电影| 亚洲一区二区小说| 在线一区视频| 精品久久91| 国产精品羞羞答答在线观看| 91午夜精品| 四虎国产精品免费观看| 亚洲欧美日韩精品一区二区 | 好吊视频一区二区三区四区| 久久精品理论片| 国产剧情一区二区在线观看| 日韩av一级片| 日本不卡视频在线观看| 国产午夜精品一区二区三区欧美 | 国产成人精品亚洲线观看| 亚洲我射av| 亚洲伊人影院| 日韩中文av| 青青草国产精品亚洲专区无| 日本久久一区| 久久在线91| 国产综合色区在线观看| 成人羞羞视频播放网站|