最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java lambda循環(huán)_使用Java 8 Lambda簡(jiǎn)化嵌套循環(huán)操作

 更新時(shí)間:2020年09月14日 09:45:16   作者:dnc8371  
這篇文章主要介紹了java lambda循環(huán)_使用Java 8 Lambda簡(jiǎn)化嵌套循環(huán)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧

java lambda循環(huán)

對(duì)于每個(gè)經(jīng)常需要在Java 8(或更高版本)中使用多維數(shù)組的人來(lái)說(shuō),這只是一個(gè)快速技巧。

在這種情況下,您可能經(jīng)常會(huì)以類(lèi)似于以下代碼的結(jié)尾:

float[][] values = ...
for (int i = 0; i < values.length; i++) {
 for (int k = 0; k < values[i].length; k++) {
 float value = values[i][k];
 // do something with i, k and value
 }
}

如果幸運(yùn)的話(huà),可以用for-each循環(huán)替換循環(huán)。 但是,循環(huán)內(nèi)的計(jì)算通常需要索引。

在這種情況下,您可以提出一個(gè)簡(jiǎn)單的實(shí)用程序方法,如下所示:

private void loop(float[][] values, BiConsumer<Integer, Integer> consumer) {
 for (int i = 0; i < values.length; i++) {
 for (int k = 0; k < values[i].length; k++) {
 consumer.accept(i, k);
 }
 }
}

現(xiàn)在,我們可以像這樣循環(huán)遍歷數(shù)組索引:

float[][] values = ...
loop(values, (i, k) -> {
 float value = values[i][k];
 // do something with i, k and value
});

這樣,您可以使循環(huán)代碼脫離主要邏輯。

當(dāng)然,您應(yīng)該更改所示的loop()方法,使其適合您的個(gè)人需求。

翻譯自: https://www.javacodegeeks.com/2016/04/simplifying-nested-loops-java-8-lambdas.html

補(bǔ)充知識(shí):JAVA8-lambda表達(dá)式-并行流,提升效率的利器?

寫(xiě)在前面的話(huà)

在前面我們已經(jīng)看過(guò)了一些流的處理,那么Lambda除了在寫(xiě)法上的不同,還有其它什么作用呢?當(dāng)然有,就是數(shù)據(jù)并行化處理!

它在某些場(chǎng)景下可以提高程序的性能。我們先看一個(gè)前面的例子,查找所有的男同學(xué)

// 流方式

List<Person> newBoys = personList.stream().filter(p -> 1 == p.getSex()).collect(Collectors.toList());

現(xiàn)在用并行流改寫(xiě)一下

// 流方式:找出所有男同學(xué)

List<Person> newBoys = personList.parallelStream().filter(p -> 1 == p.getSex()).collect(Collectors.toList());

細(xì)心的同學(xué)已經(jīng)發(fā)現(xiàn)區(qū)別了,stream與parallelStream,是的,要用并行流parallelStream,就是這么簡(jiǎn)單!

什么是并行

有必要嘗試解釋一下,什么是數(shù)據(jù)并行化

Java支持多線(xiàn)程,可以同時(shí)開(kāi)啟多個(gè)任務(wù)。引入多線(xiàn)程的原因在于,線(xiàn)程可能會(huì)阻塞,CPU會(huì)主動(dòng)切分時(shí)間片,只有分配到時(shí)間片的線(xiàn)程才會(huì)運(yùn)行。而現(xiàn)代的處理器,幾乎都是多核的,即多個(gè)CPU,如何才能更高效的利用硬件呢,多線(xiàn)程。

并行和多線(xiàn)程是有區(qū)別的,比如運(yùn)送一堆貨物,如果只有一輛車(chē)(單線(xiàn)程),肯定慢,平時(shí)如果貨少,那還能應(yīng)付過(guò)來(lái) ,如果比如某寶的"雙十一",那就肯定快遞像垃圾一樣如山,怎么辦呢?我們可以增加車(chē)輛(多線(xiàn)程),那么肯定能加快運(yùn)送速度。但是有一個(gè)前提,必須是多條道(多核CPU)。而在有些只有單個(gè)出口的地方,還必須排隊(duì)(并發(fā),線(xiàn)程安全)

而并行的針對(duì)同一個(gè)任務(wù)的。比如還是一輛車(chē)的貨,10000件,全部放在A車(chē)上,要跑N個(gè)小時(shí)。現(xiàn)在取出一半放到B車(chē)上,理論上A,B2車(chē)同時(shí)跑,是不是會(huì)理快呢?嘿嘿嘿,這就是說(shuō)的數(shù)據(jù)并行化,這里不會(huì)涉及并發(fā)。而這一切,Java8的并行流都在底層幫我們實(shí)現(xiàn)了

一定會(huì)更快?

紙上得來(lái)終覺(jué)淺,絕知此事要躬行!我們來(lái)看下,前面2個(gè)代碼的分別執(zhí)行時(shí)間

@Test
 public void test() {
 
 // 數(shù)據(jù)并行化處理
 // 學(xué)生集合
 Person kobe = new Person("kobe", 40, 1);
 Person jordan = new Person("jordan", 50, 1);
 Person mess = new Person("mess", 20, 2);
 List<Person> personList = Arrays.asList(kobe, jordan, mess);
 
 long beginTime = System.currentTimeMillis();
 
 // 原來(lái)的方式
 List<Person> oldBoys = new ArrayList<>(personList.size());
 for (Person p : personList) {
  // 性別男
  if (p.getSex() == 1) {
  oldBoys.add(p);
  }
 }
 long endTime = System.currentTimeMillis();
 log.info("原來(lái)的方式 take time:" + (endTime - beginTime));
 
 beginTime = System.currentTimeMillis();
 // 流方式:找出所有男同學(xué)
 List<Person> newBoys = personList.stream()
 .filter(p -> 1 == p.getSex())
 .collect(Collectors.toList());
 
 endTime = System.currentTimeMillis();
 log.info("流方式 take time:" + (endTime - beginTime));
 
 
 beginTime = System.currentTimeMillis();
 // 流方式:找出所有男同學(xué)
 List<Person> parallelBoys = personList.parallelStream()
 .filter(p -> 1 == p.getSex())
 .collect(Collectors.toList());
 
 endTime = System.currentTimeMillis();
 log.info("并行流方式 take time:" + (endTime - beginTime));
 }

咦,是不是很奇怪,原來(lái)的for循環(huán)方式最快?多執(zhí)行幾次,發(fā)現(xiàn)結(jié)果也是這樣的,那真是這樣嗎,我們把數(shù)據(jù)量擴(kuò)大試試

還是更慢,換個(gè)方法試試

@Test
	public void test() {
 
		// 學(xué)生集合
		List<Person> personList = new ArrayList<>(1000000);
		for (int i = 0, j = 1000000; i < j; i++) {
			int sex = i % 2;
			Person p = new Person(String.valueOf(i), i, sex);
			personList.add(p);
		}
 
		long beginTime2 = System.currentTimeMillis();
		// 流方式:年齡之和
		int parallelAges = personList.parallelStream().mapToInt(p -> p.getAge()).sum();
 
		long endTime2 = System.currentTimeMillis();
		log.info("并行流方式 take time:" + (endTime2 - beginTime2));
		log.info("parallelAges:" + parallelAges);
 
		long beginTime = System.currentTimeMillis();
 
		// 原來(lái)的方式
		int totalAge = 0;
		for (Person p : personList) {
			// 年齡之和
			totalAge = totalAge + p.getAge();
		}
		long endTime = System.currentTimeMillis();
		log.info("原來(lái)的方式 take time:" + (endTime - beginTime));
		log.info("totalAge:" + totalAge);
 
	}

看看結(jié)果,還是更慢。。。這倒很出我意外,崩潰了,

可能跟我機(jī)器有關(guān)吧。所以還是需要找地方驗(yàn)證,如果哪位同學(xué)能解答一下,歡迎指教

這里引用一下《java8函數(shù)式編程》的結(jié)論

一些條件

輸入數(shù)據(jù)的大小。

理論上輸入的數(shù)據(jù)越大,操作越復(fù)雜,并行流的效果越好。因?yàn)椴鸱謹(jǐn)?shù)據(jù)處理,最后合并結(jié)果都會(huì)帶來(lái)額外的開(kāi)銷(xiāo)。我們可以通過(guò)修改前面的例子,personList的大小來(lái)觀察

可以看到,數(shù)據(jù)越大,并行效果越好。當(dāng)然,真實(shí)項(xiàng)目中的處理遠(yuǎn)比上面復(fù)雜,而超過(guò)1000w的數(shù)據(jù),我本地機(jī)器就OOM了尷尬

數(shù)據(jù)結(jié)構(gòu)

我們通常是操作集合。一般來(lái)說(shuō),越好分割的并行速度越快。比如ArrayList,數(shù)組等支持隨機(jī)讀取的,效果較好。

HashSet,TreeSet,這類(lèi)不容易公平的分解。而LinkedList,Stream.iterator等分解就比較困難的,效果是比較差的

裝箱

處理包裝類(lèi)比基本類(lèi)型花的時(shí)間多,肉眼可見(jiàn)

核的數(shù)量

當(dāng)然,如果核的數(shù)量越多,獲得潛在并行提升速度的趕快。比如4核一般比雙核快,對(duì)吧

以上這篇java lambda循環(huán)_使用Java 8 Lambda簡(jiǎn)化嵌套循環(huán)操作就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • java交換排序之奇偶排序?qū)崿F(xiàn)方法

    java交換排序之奇偶排序?qū)崿F(xiàn)方法

    這篇文章主要介紹了java交換排序之奇偶排序?qū)崿F(xiàn)方法,實(shí)例分析了奇偶排序的原理與具體實(shí)現(xiàn)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-02-02
  • Java重點(diǎn)之基于比較的七大排序

    Java重點(diǎn)之基于比較的七大排序

    最近幾天在研究排序算法,看了很多博客,發(fā)現(xiàn)網(wǎng)上有的文章中對(duì)排序算法解釋的并不是很透徹,而且有很多代碼都是錯(cuò)誤的,所以我根據(jù)這幾天看的文章,整理了一個(gè)較為完整的排序算法總結(jié),本文中的所有算法均有JAVA實(shí)現(xiàn),經(jīng)本人調(diào)試無(wú)誤后才發(fā)出,如有錯(cuò)誤,請(qǐng)各位前輩指出
    2021-10-10
  • Java反射的使用和原理詳解

    Java反射的使用和原理詳解

    這篇文章主要介紹了Java反射的使用和原理詳解,反射是java語(yǔ)言的一個(gè)特性,它允程序在運(yùn)行時(shí)(注意不是編譯的時(shí)候)來(lái)進(jìn)行自我檢查并且對(duì)內(nèi)部的成員進(jìn)行操作,需要的朋友可以參考下
    2024-01-01
  • 談?wù)勗贘ava發(fā)送郵件中遇到的的問(wèn)題

    談?wù)勗贘ava發(fā)送郵件中遇到的的問(wèn)題

    本文介紹了在利用Java發(fā)送郵件過(guò)程中遇到的的兩個(gè)問(wèn)題,以及如何解決這兩個(gè)問(wèn)題。如果大家也遇到了這些問(wèn)題,可以來(lái)參考借鑒。
    2016-08-08
  • Java圖片讀取ImageIO.read()報(bào)錯(cuò)問(wèn)題及解決

    Java圖片讀取ImageIO.read()報(bào)錯(cuò)問(wèn)題及解決

    在使用imageio庫(kù)讀取圖片時(shí),如果路徑中包含中文,可能會(huì)導(dǎo)致讀取失敗,解決方法是將路徑中的中文字符進(jìn)行轉(zhuǎn)義處理,可以使用ImageUtil.java工具類(lèi)進(jìn)行路徑轉(zhuǎn)義,從而避免錯(cuò)誤,這是一個(gè)常見(jiàn)問(wèn)題,希望本文的解決方案能幫助到遇到相同問(wèn)題的開(kāi)發(fā)者
    2024-10-10
  • java實(shí)現(xiàn)字符串like和not?like的使用示例

    java實(shí)現(xiàn)字符串like和not?like的使用示例

    在Java中,我們經(jīng)常需要對(duì)字符串進(jìn)行模式匹配操作,字符串的模式匹配通常使用like和not?like這兩個(gè)運(yùn)算符進(jìn)行,本文就來(lái)介紹一下如何實(shí)現(xiàn),感興趣的可以了解一下
    2023-09-09
  • Java中的@SneakyThrows注解詳解

    Java中的@SneakyThrows注解詳解

    這篇文章主要介紹了Java中的@SneakyThrows注解詳解,@SneakyThrows將當(dāng)前方法拋出的異常,包裝成RuntimeException,騙過(guò)編譯器,使得調(diào)用點(diǎn)可以不用顯示處理異常信息,需要的朋友可以參考下
    2023-10-10
  • MyBatis與Spring中的SqlSession詳解

    MyBatis與Spring中的SqlSession詳解

    在MyBatis中,你可以使用SqlSessionFactory來(lái)創(chuàng)建SqlSession,使用MyBatis-Spring之后,你不再需要直接使用SqlSessionFactory了,接下來(lái)通過(guò)示例代碼講解MyBatis與Spring中的SqlSession,需要的朋友可以參考下
    2024-05-05
  • JavaWeb如何發(fā)送狀態(tài)碼方法解析

    JavaWeb如何發(fā)送狀態(tài)碼方法解析

    這篇文章主要介紹了JavaWeb如何發(fā)送狀態(tài)碼方法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • Java面試之線(xiàn)程通訊方式詳解

    Java面試之線(xiàn)程通訊方式詳解

    線(xiàn)程通信是指多個(gè)線(xiàn)程之間通過(guò)某種機(jī)制進(jìn)行協(xié)調(diào)和交互,那為什么一個(gè)線(xiàn)程等待和通知機(jī)制就需要這么多的實(shí)現(xiàn)方式呢?別著急,下面小編來(lái)和大家仔細(xì)聊聊
    2023-08-08

最新評(píng)論

简阳市| 永登县| 襄樊市| 九龙县| 舒兰市| 大竹县| 永和县| 延寿县| 秭归县| 邵阳市| 台前县| 烟台市| 临高县| 庄浪县| 乾安县| 仙居县| 普兰县| 梁河县| 通道| 云浮市| 习水县| 得荣县| 兖州市| 四川省| 东至县| 黄陵县| 万安县| 开封县| 志丹县| 瑞安市| 榆树市| 平度市| 酒泉市| 霍州市| 大方县| 上林县| 吐鲁番市| 同仁县| 永清县| 永丰县| 民丰县|