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

首頁 > 開發 > Java > 正文

都9102年了,你還用for循環操作集合嗎

2024-07-14 08:43:50
字體:
來源:轉載
供稿:網友

前言

前段時間公司書架多了一本《Java8 實戰》,畢竟久聞lambda的大名,于是借來一閱。這一看,簡直是驚為天人啊,lambda,stream,java8里簡直是滿腦子騷操作,看我的一愣一愣的。我甚至是第一次感覺到了什么叫優雅。

for循環,集合

本文主要介紹java8中的流處理,看看java8是怎么愉快的玩耍集合的,讓我們來一起感受java8的魅力吧!

我就隨便舉個例子,看看Stream有多優雅。

// 對蘋果按顏色匯總并績數量Map<String, Long> appleCount = apples.stream() .collect(groupingBy(Apple::getColor, counting()));// 過濾掉顏色為黑色的蘋果,并匯總好蘋果的總金額Double sum = apples.stream() .filter(i->"black".equals(i.getColor())) .collect(toList);

一、lambda表達式

雖然本文重點是stream,但是stream中需要傳遞lambda表達式,所以簡單介紹一下lambda表達式。lambda表達式其實就是匿名函數(anonymous function),是指一類無需定義標識符的函數或子程序。

java中匿名函數的表現形式,只留下入參和方法體中的內容

// 普通函數public void run(String s){ System.out.print(s+"哈哈");}// 我不要名字啦?。?!(s)->System.out.print(s+"哈哈")

誒,過去我們都用對象調方法的,你弄這個沒名的東西啥時候用啊?

java中我們通過函數式接口來使用這種匿名函數。

函數式接口

1.java中只包含一個未實現方法的接口。其中可以有與Object中同名的方法和默認方法(java8中接口方法可以有默認實現)。

2.java中函數式接口使用@FunctionalInterface進行注解。Runnable、Comparator都是函數式接口。

3.java.util.function包下為我們提供很多常用的函數式接口,例如Function等。

用法舉例:

// 實現Runnable中的run方法,替代匿名內部類。Runnable r = ()->System.out.print("哈哈");// 作為參數傳遞。new Thread(()-> System.out.println("haha")).start();ArrayList<Apple> list = new ArrayList<>();list.forEach(i-> System.out.println(i.getWeight()));// 簡化策略模式public static List<Apple> filterApples(List<Apple> inventory,ApplePredicate p){ List<Apple> apples = new ArrayList<>(); for(Apple apple : inventory){ if(p.test(apple)){ apples.add(apple); } } return apples;}public class BigApple implement ApplePredicate{ @Override public boolean test(Apple a){ if(a.getWeight>10){ return a } }}// 這是個簡單的策略模式,根據用戶的需要,創建不同的接口ApplePredicate實現類,調用時傳入不同的實現類就可以,但問題是如果需求過多,創建的實現類也會很多,過于臃腫不方便管理。xx.filterApple(inventory,new BigApple);// 使用lambda表達式,不在需要創建BigApple類xx.filterApple(inventory,i->(i.getWeight>10));

使用lambda表達式可以簡化大量的模板代碼,并且可以向方法直接傳遞代碼。

總之

方法出參入參來自函數式接口

//入參s,返回void(s)->System.out.println(s);//入參空,返回void()->System.out.print("haha");//入參i,返回i+1i->i+1//后面寫代碼塊apple->{if(apple.getWeiht>5) return "BIG"; else return "small"; }

好了,不多啰嗦了,如果感興趣推薦下面的文章或《Java8實戰》的前三章。

1.Lambda表達式有何用處?如何使用?

2.java8實戰

二、Stream

流是什么?

Java API的新成員,它允許你使用聲明式方式處理數據集合(類似sql,通過查詢語句表達,而不是臨時編寫一個實現)。

如果有人說lambda表達式不易于理解,那還勉強可以接受(其實過于復雜的lambda缺失不好閱讀,但通常lambda不會做太復雜的實現),但流真的非常的易懂易用。這個語法糖真的是甜死了。

注意事項:

1.流只能使用一次,遍歷結束就代表這個流被消耗掉了

2.流對集合的操作屬于內部迭代,是流幫助我們操作,而不是外部迭代

3.流操作包含:數據源,中間操作鏈,終端操作三個部分。

基礎流操作

List<Double> collect = list.stream() // 過濾掉黑色的蘋果 .filter(i -> "black".equals(i.getColor())) // 讓蘋果按照重量個價格排序 .sorted(Comparator.comparing(Apple::getWeight) .thenComparing(i->i.getPrice())) // 篩選掉重復的數據 .distinct() // 只要蘋果的價格 .map(Apple::getPrice) // 只留下前兩條數據 .limit(2) // 以集合的形式返回 .collect(toList());// 循環打印列表中元素list.forEach(i->System.out.print(i));

Apple::getPrince<=>i -> i.getPrince()可以看做是僅涉及單一方法的語法糖,效果與lambda表達式相同,但可讀性更好。

同理

下面列表為常見操作

中間

 

操作 類型 作用 函數描述 函數
filter 中間 過濾 T -> boolean Predicate
sorted 中間 排序 (T,T)->int Comparator
map 中間 映射 T->R Function<T,R>
limit 中間 截斷    
distinct 中間 去重,根據equals方法    
skip 中間 跳過前n個元素    

 

終端

 

操作 類型 作用
forEach 終端 消費流中的每個元素,使用lambda進行操作
count 終端 返回元素個數,long
collect 終端 將流歸約成一個集合,如List,Map甚至是Integer

 

篩選與切片

List<String> strings = Arrays.asList("Hello", "World");List<String> collect1 = strings.stream() // String映射成String[] .map(i -> i.split("")) // Arrays::Stream 數據數組,返回一個流String[]->Stream<String> // flatMap各數組并不分別映射成一個流,而是映射成流的內容 Stream<String>->Stream .flatMap(Arrays::stream) .collect(toList());System.out.println(collect);----->輸出 [H, e, l, l, o, W, o, r, l, d]

歸約操作reduce

List<Integer> integers = Arrays.asList(12, 3, 45, 3, 2,-1);// 有初始值的疊加操作Integer reduce = integers.stream().reduce(3, (i, j) -> i + j);Integer reduce2 = integers.stream().reduce(5, (x, y) -> x < y ? x : y);// 無初始值的疊加操作Optional<Integer> reduce1 = integers.stream().reduce((i, j) -> i + j);// 無初始值的最大值Optional<Integer> reduce4 = integers.stream().reduce(Integer::min);// 無初始值的最大值Optional<Integer> reduce5 = integers.stream().reduce(Integer::max);// 求和Optional<Integer> reduce6 = integers.stream().reduce(Integer::sum);

reduce做的事情是取兩個數進行操作,結果返回取下一個數操作,以次類推。

Optional是java8引入的新類,避免造成空指針異常,在集合為空時,結果會包在Optional中,可以用isPresent()方法來判斷是否為空值。

無初始值的情況下可能為空,故返回Optional

中間

 

操作 類型 作用 函數描述 函數
flatmap 中間 使通過的流返回內容 T -> boolean Predicate

 

終端

 

操作 類型 作用
anyMatch 終端 返回boolean,判斷是否有符合條件內容
noneMatch 終端 返回boolean,判斷是否無符合條件內容
allMatch 終端 返回boolean,判斷是全為符合條件內容
findAny 終端 Optional,隨機找一個元素返回
findFirst 終端 Optional,返回第一個元素
reduce 終端 Optional (T,T)->T 歸約操作

 

數值流

包裝類型的各種操作都會有拆箱操作和裝箱操作,嚴重影響性能。所以Java8為我們提供了原始數值流。

// 數值流求平均值OptionalDouble average = apples.stream() .mapToDouble(Apple::getPrice) .average();// 數值流求和OptionalDouble average = apples.stream() .mapToDouble(Apple::getPrice) .sum();// 數值流求最大值,沒有則返回2double v = apples.stream() .mapToDouble(Apple::getPrice) .max().orElse(2);// 生成隨機數IntStream s = IntStream.rangeClosed(1,100);

下面列表為常見數值流操作操作

中間

 

操作 類型 作用
rangeClosed(1,100) 中間 生成隨機數(1,100]
range(1,100) 中間 生成隨機數(1,100)
boxed() 中間 包裝成一般流
mapToObj 中間 返回為對象流
mapToInt 中間 映射為數值流

 

終端,終端操作與List一般流類似

構建流

值創建

Stream<String> s = Stream.of("java","python");

數組創建

int[] i = {2,3,4,5};Stream<int> = Arrays.stream(i);

由文件生成,NIO API已經更新,以便利用Stream API

Stream<String> s = Files.lines(Paths.get("data.txt"),Charset.defaultCharset());

由函數創建流:無限流

// 迭代Stream.iterate(0,n->n+2) .limit(10) .forEach(System.out::println);// 生成,需要傳遞實現Supplier<T>類型的Lambda提供的新值Stream.generate(Math.random) .limit(5) .forEach(System.out::println);

三、總結

至此,本文講述了常見的流操作,目前排序、篩選、求和、歸約等大多數操作我們都能實現了。與過去相比,操作集合變的簡單多了,代碼也變的更加簡練明了。

目前Vert.x,Spring新出的WebFlux都通過lambda表達式來簡化代碼,不久的將來,非阻塞式框架的大行其道時,lambda表達式必將變的更加重要!

至于開篇見到的分組?。。∠缕恼乱妦

好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對VeVb武林網的支持。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美在线一级va免费观看| 精品国产户外野外| 51ⅴ精品国产91久久久久久| 国产mv免费观看入口亚洲| 亚洲视频在线观看| 91成人在线视频| 国产精品情侣自拍| 国产精品夜色7777狼人| 国内精品久久久久伊人av| 欧美交受高潮1| 91在线观看免费| 2019中文字幕在线免费观看| 欧美精品aaa| 日本精品va在线观看| 91精品国产免费久久久久久| 成人激情电影一区二区| 日韩在线资源网| 成人性生交大片免费看小说| 亚洲影院高清在线| 91免费视频国产| 91久久国产精品| 国产99久久精品一区二区永久免费| 8050国产精品久久久久久| 91香蕉嫩草神马影院在线观看| 国产成人福利夜色影视| 欧美成人免费在线观看| 中文字幕欧美精品在线| 美女视频黄免费的亚洲男人天堂| 亚洲欧美激情另类校园| 国产一区二区三区在线播放免费观看| 久久久影视精品| 国产成人涩涩涩视频在线观看| wwwwwwww亚洲| 亚洲大胆人体视频| 欧美一乱一性一交一视频| 亚洲国产精品专区久久| 中文字幕精品影院| 日本道色综合久久影院| 91夜夜揉人人捏人人添红杏| 成人黄色免费看| 久久久久久亚洲精品不卡| 成人免费高清完整版在线观看| 国产精品激情av在线播放| 久久久中精品2020中文| 黑人精品xxx一区一二区| 性欧美xxxx视频在线观看| 国产精品第一页在线| 亚洲人午夜精品免费| 日韩美女毛茸茸| 一区二区欧美激情| 久久九九国产精品怡红院| 在线视频亚洲欧美| 欧美专区国产专区| 日韩男女性生活视频| 成人国产精品av| 国产精品极品在线| 欧美大尺度在线观看| 久久国产精品影片| 国模叶桐国产精品一区| 麻豆国产va免费精品高清在线| 亚洲国产成人在线播放| 国产在线精品成人一区二区三区| 日韩电影免费观看在线| 欧美精品xxx| …久久精品99久久香蕉国产| 亚州国产精品久久久| 亚洲成人性视频| 懂色av一区二区三区| 亚洲色图欧美制服丝袜另类第一页| 久久久国产视频| 欧美日韩爱爱视频| 中文字幕av一区二区三区谷原希美| 69久久夜色精品国产69| 午夜精品久久久久久久男人的天堂| 国产97在线亚洲| 国产精品xxx视频| 一区二区三区视频在线| 亚洲日韩欧美视频一区| 日韩亚洲欧美成人| 欧美成年人网站| 国产69精品久久久久99| 国产精品海角社区在线观看| 久久久精品影院| 日韩av在线电影网| 国产91在线播放| 91成人在线观看国产| 久久综合久久美利坚合众国| 国产xxx69麻豆国语对白| 亚洲偷熟乱区亚洲香蕉av| 欧美性猛交xxxx乱大交极品| 一个人看的www久久| 精品国产91久久久| 欧美日韩国产区| 国产成人鲁鲁免费视频a| 精品久久久久久久久久国产| 91亚洲午夜在线| 亚洲女人被黑人巨大进入al| 亚洲最新av在线| 国产不卡一区二区在线播放| 久久精品久久久久久国产 免费| 亚洲专区中文字幕| 国产欧美亚洲视频| 国产精品狼人色视频一区| 91日本在线观看| 国语自产精品视频在免费| 欧美高清理论片| 美女性感视频久久久| 68精品国产免费久久久久久婷婷| 日韩美女在线看| 欧美老女人xx| 亚洲午夜久久久久久久| 日本成熟性欧美| 91国产视频在线播放| 国模吧一区二区三区| 亚洲欧美日韩一区二区三区在线| 亚洲激情国产精品| 欧美性xxxx在线播放| 久久久亚洲福利精品午夜| 国产精品成人av在线| 日韩中文在线中文网三级| 国产91精品不卡视频| 日韩在线观看精品| 日韩免费在线看| 欧美男插女视频| 国产亚洲日本欧美韩国| 中文字幕日本欧美| 久久久噜噜噜久久中文字免| www.亚洲人.com| 久久中文字幕国产| 成人激情视频小说免费下载| 欧美日韩成人精品| 清纯唯美亚洲综合| 欧美日韩亚洲天堂| 国产精自产拍久久久久久| 日韩电影免费观看在线| 超薄丝袜一区二区| 久久精品国产亚洲一区二区| 久久久久久噜噜噜久久久精品| 插插插亚洲综合网| 按摩亚洲人久久| 欧洲亚洲在线视频| 欧美在线一区二区三区四| 日韩毛片中文字幕| 亚洲第一区第二区| 久久精品人人做人人爽| 午夜精品福利电影| 岛国av一区二区三区| 福利视频第一区| 国产精品成熟老女人| 欧美电影免费看| 亚洲xxxx在线| 国产成人综合久久| 亚洲精品日产aⅴ| 亚洲aⅴ男人的天堂在线观看| 亚洲欧洲日产国产网站| 久久久99免费视频| 国产一区二区三区三区在线观看| 国产综合在线观看视频| 日韩av一区二区在线| 国产精品偷伦视频免费观看国产| 亚洲国产欧美一区| 亚洲黄色免费三级| 亚洲国产精品嫩草影院久久| 国产伦精品一区二区三区精品视频|