欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

java lambda循環(huán)

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

在這種情況下,您可能經(jīng)常會以類似于以下代碼的結(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
 }
}

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

在這種情況下,您可以提出一個簡單的實用程序方法,如下所示:

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()方法,使其適合您的個人需求。

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

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

寫在前面的話

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

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

// 流方式

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

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

// 流方式:找出所有男同學(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,就是這么簡單!

什么是并行

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

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

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

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

一定會更快?

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

@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();
 
 // 原來的方式
 List<Person> oldBoys = new ArrayList<>(personList.size());
 for (Person p : personList) {
  // 性別男
  if (p.getSex() == 1) {
  oldBoys.add(p);
  }
 }
 long endTime = System.currentTimeMillis();
 log.info("原來的方式 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));
 }

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

還是更慢,換個方法試試

@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();
 
		// 原來的方式
		int totalAge = 0;
		for (Person p : personList) {
			// 年齡之和
			totalAge = totalAge + p.getAge();
		}
		long endTime = System.currentTimeMillis();
		log.info("原來的方式 take time:" + (endTime - beginTime));
		log.info("totalAge:" + totalAge);
 
	}

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

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

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

一些條件

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

理論上輸入的數(shù)據(jù)越大,操作越復(fù)雜,并行流的效果越好。因為拆分?jǐn)?shù)據(jù)處理,最后合并結(jié)果都會帶來額外的開銷。我們可以通過修改前面的例子,personList的大小來觀察

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

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

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

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

裝箱

處理包裝類比基本類型花的時間多,肉眼可見

核的數(shù)量

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

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

相關(guān)文章

  • Java獲取IP地址以及MAC地址的示例代碼

    Java獲取IP地址以及MAC地址的示例代碼

    IP地址是用于在網(wǎng)絡(luò)上識別設(shè)備的唯一地址,而MAC地址是設(shè)備的物理地址,本文主要介紹了Java獲取IP地址以及MAC地址的示例代碼,具有一定的參考價值,感興趣的可以了解一下
    2024-04-04
  • idea如何在service窗口中顯示多個服務(wù)

    idea如何在service窗口中顯示多個服務(wù)

    這篇文章主要介紹了idea如何在service窗口中顯示多個服務(wù)問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • java多線程編程之為什么要進行數(shù)據(jù)同步

    java多線程編程之為什么要進行數(shù)據(jù)同步

    數(shù)據(jù)同步就是指在同一時間,只能由一個線程來訪問被同步的類變量,當(dāng)前線程訪問完這些變量后,其他線程才能繼續(xù)訪問,下面看一下為什么要進行數(shù)據(jù)同步
    2014-01-01
  • @insert mybatis踩坑記錄,實體接收前端傳遞的參數(shù)

    @insert mybatis踩坑記錄,實體接收前端傳遞的參數(shù)

    這篇文章主要介紹了@insert mybatis踩坑記錄,實體接收前端傳遞的參數(shù)問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • Java的RxJava庫操作符的用法及實例講解

    Java的RxJava庫操作符的用法及實例講解

    RxJava由于提供異步和基于事件的支持在Android開發(fā)者中獲得了不少人氣,這里我們就來看一下Java的RxJava庫操作符的用法及實例講解,需要的朋友可以參考下
    2016-06-06
  • java小程序火鍋店點餐系統(tǒng)

    java小程序火鍋店點餐系統(tǒng)

    這篇文章主要介紹了java小程序火鍋店點餐系統(tǒng),采用Java語言和Vue技術(shù),以小程序模式實現(xiàn)的火鍋點菜系統(tǒng),文中提供了解決思路和部分實現(xiàn)代碼,需要的朋友可以參考下
    2023-03-03
  • SpringBoot 如何根據(jù)不同profile選擇不同配置

    SpringBoot 如何根據(jù)不同profile選擇不同配置

    這篇文章主要介紹了SpringBoot 如何根據(jù)不同profile選擇不同配置的操作方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • 詳解Java使用雙異步后如何保證數(shù)據(jù)一致性

    詳解Java使用雙異步后如何保證數(shù)據(jù)一致性

    這篇文章主要為大家詳細(xì)介紹了Java使用雙異步后如何保證數(shù)據(jù)一致性,文中的示例代碼講解詳細(xì),具有一定的借鑒價值,有需要的小伙伴可以了解下
    2024-01-01
  • Java實現(xiàn)二維碼、條形碼功能(案例代碼)

    Java實現(xiàn)二維碼、條形碼功能(案例代碼)

    ZXing是一個開放源碼的,用Java實現(xiàn)的多種格式的1D/2D條碼圖像處理庫,它包含了聯(lián)系到其他語言的端口,Zxing可以實現(xiàn)使用手機的內(nèi)置的攝像頭完成條形碼的掃描及解碼,這篇文章主要介紹了Java實現(xiàn)二維碼、條形碼等功能,需要的朋友可以參考下
    2024-01-01
  • swagger配置正式環(huán)境中不可訪問的問題

    swagger配置正式環(huán)境中不可訪問的問題

    這篇文章主要介紹了swagger配置正式環(huán)境中不可訪問的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06

最新評論