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

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

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

瀏覽:159日期: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久久,三上悠亚国产精品一区二区三区
91av一区| 亚洲a一区二区三区| 日韩一区二区三免费高清在线观看| www在线观看黄色| 国产精品国产一区| 精品视频亚洲| 国产中文欧美日韩在线| 狠狠久久伊人| 色偷偷色偷偷色偷偷在线视频| 高清一区二区三区| 亚洲风情在线资源| 亚洲一区二区三区在线免费| 国内一区二区三区| 精品国产亚洲一区二区在线观看| 国产精品一区二区免费福利视频| 国产欧美激情| 精品日产乱码久久久久久仙踪林| 国产成人在线中文字幕| 黑森林国产精品av| 久久久久久久久99精品大| 久久激情中文| 国产精品免费看| 亚洲日本在线观看视频| 欧美有码在线| 国内不卡的一区二区三区中文字幕| sm久久捆绑调教精品一区| 国产一区二区三区不卡视频网站 | 欧美亚洲色图校园春色| 国产精品一区二区精品视频观看| 九九九精品视频| 99久久亚洲精品| 亚洲2区在线| 欧美激情福利| 九九久久国产| 在线视频免费在线观看一区二区| 中文字幕一区日韩精品| 国产精品毛片视频| 日韩免费久久| 亚洲有吗中文字幕| 麻豆精品视频在线| 欧美 日韩 国产一区二区在线视频| 久久成人精品| 国产精品成人自拍| 欧美日韩在线二区| 日本不卡一区二区三区| 精品精品99| 国产午夜精品一区二区三区欧美| 日韩视频1区| 福利片在线一区二区| 亚洲激情偷拍| 国产高清亚洲| 伊人久久成人| 国产精品多人| 在线日韩中文| 久久国产生活片100| 日韩美女一区二区三区在线观看| 亚洲毛片网站| 国产麻豆久久| 国产一精品一av一免费爽爽| 欧美成人基地| 国产免费av一区二区三区| 国产一区久久| 国产福利一区二区精品秒拍 | 日韩不卡一区二区三区| 国产99在线| 日韩中文字幕无砖| 成人欧美一区二区三区的电影| 老牛国产精品一区的观看方式| 欧美91在线|欧美| 亚洲欧美日韩精品一区二区| 精品中国亚洲| 亚洲精品国产精品粉嫩| 亚洲伦乱视频| 欧美亚洲综合视频| 午夜精品婷婷| 精品三区视频| 国产精品av一区二区| 国产伦理久久久久久妇女| 欧美精品一二| 视频在线观看一区| 国产极品模特精品一二| 国产精品婷婷| av在线最新| 久久精品72免费观看| 91精品观看| 精品国产精品国产偷麻豆| 日韩综合小视频| 蘑菇福利视频一区播放| 国产精品对白久久久久粗| 亚洲日韩视频| 国产精品日本欧美一区二区三区| 日本黄色精品| 人人爱人人干婷婷丁香亚洲| 亚洲高清影视| 久久久久久久久丰满| 久久99视频| 日韩国产在线观看一区| 国产一区白浆| 欧美.日韩.国产.一区.二区| 国产粉嫩在线观看| 麻豆国产精品视频| 欧美在线精品一区| 日韩1区2区3区| 一区三区视频| av一区二区高清| 999国产精品视频| 国产成人免费av一区二区午夜| 国产亚洲精品美女久久| 亚洲精品日韩久久| 免费国产亚洲视频| 日韩午夜电影| 欧美日韩国产免费观看| 欧美一级精品| 亚洲国内精品| 欧美日韩中文一区二区| 国产99精品一区| 久久亚洲专区| 国内精品福利| 91精品国产91久久久久久黑人| 首页国产精品| 精品国产乱码久久久久久樱花| 欧美黄页在线免费观看| 国产精品久久久久久av公交车| 欧美影院精品| 免费一级欧美在线观看视频 | 蜜臀a∨国产成人精品| 国产一区91| 天堂成人国产精品一区| 亚洲免费一区二区| 黄色av日韩| 国产伊人精品| 亚洲免费高清| 在线观看一区| 日本亚洲最大的色成网站www| 日韩1区2区3区| 国产精品天天看天天狠| 麻豆中文一区二区| 神马午夜在线视频| 激情婷婷欧美| 亚洲深夜福利| 三级亚洲高清视频| 日韩精品欧美大片| 国产精品一国产精品| 成人午夜在线| 亚洲综合在线电影| 99国产成+人+综合+亚洲欧美| 视频在线观看91| 国产视频一区二区在线播放| 麻豆国产精品视频| 中文字幕亚洲影视| 亚洲精品乱码| 九九久久婷婷| 欧美搞黄网站| 91九色精品国产一区二区| 91亚洲人成网污www| 国产乱码午夜在线视频| 九色porny丨国产首页在线| 欧美午夜精彩| 免费精品视频最新在线| 日韩不卡一二三区| 久久精品播放| 麻豆一区二区99久久久久| 亚洲欧美网站| 超碰99在线| 国产中文一区| 丝袜美腿亚洲一区| 视频一区中文字幕精品 | 欧洲一级精品| 亚洲一区二区免费看| 日韩精选在线| 国产精品原创| 国产精品日本| 亚洲网址在线观看| 国产精品久久久亚洲一区| 亚洲精品福利电影| 西西人体一区二区| 免费在线亚洲| 欧美特黄一级| 久久国产精品免费一区二区三区 | 麻豆国产欧美一区二区三区| 久久久久亚洲| 日韩一区二区三免费高清在线观看| 你懂的网址国产 欧美| 亚洲午夜黄色| 日韩av不卡在线观看| 成人污污视频| 激情五月综合| 青草国产精品久久久久久| av日韩中文| 伊人久久亚洲美女图片| 日本强好片久久久久久aaa| 综合亚洲视频| 日韩精品视频中文字幕| 久久在线电影| 亚洲少妇在线| 国产精品sss在线观看av| 国产精品成人a在线观看| 中文字幕在线官网| 亚洲在线久久| 成人精品国产亚洲|