Java的stream代替List解決單線程等問題

原文鏈接:Java的stream代替List解決單線程等問題
😆現在不知道怎麼了,寫博客不喜歡寫文字講解,直接擼代碼。


日常開發中,項目中存在大量的如下的代碼:

對了,先介紹一下lambda表達式

private void testLambda() {
    List list = new ArrayList();
    //循環此list
    for (int i = 0; i < list.size(); i++) {
        System.out.println("for循環");
    }
    for (Object o : list) {
        System.out.println("forEach循環");
    }
    //這裏我們的lambda登場了
    list.forEach(s -> {
        System.out.println("lambda表達式循環");
    });
}

ok,lambda表達式如上:

接着看我們的正題:如下代碼

Stream<DemoEntity> entityStream = demoEntityList.stream();
//獲取一個並行的流文件
Stream<DemoEntity> deParallel = demoEntityList.parallelStream();

//lambda表達式,做簡單的for循環
demoEntityList.forEach(demoEntity -> System.out.println("lambda表達式"));
/**
 * *******場景一:*******
 * 根據某Id,獲取實體對象列表
 * 原解法:
 */
List<DemoEntity> resultById = new ArrayList();
for (DemoEntity d : demoEntityList) {
    if ("id".equals(d.getId())) {
        resultById.add(d);
    }
}

是不是看起來很,,,煩躁,代碼多了,看了起來更暈,ok
改進如下:
//改進:

demoEntityList.parallelStream().filter(demoEntity -> 
			"id".equals(demoEntity.getId())).collect(Collectors.toList());

如此,一行代碼搞定。

/**
 * *******場景二:*******
 * 根據某Id,獲取對象列表內的某個元素列表
 * 原解法:
 */
List<String> resultByIdStr = new ArrayList();
for (DemoEntity d : demoEntityList) {
    if ("id".equals(d.getId())) {
        resultByIdStr.add(d.getDeName());
    }
}
//改進:
demoEntityList.parallelStream().filter(demoEntity -> 		
				"id".equals(demoEntity.getId())).map(DemoEntity::getDeName)
				.collect(Collectors.toList());

場景還沒有完,再看以下

/**
 * *******場景三:*******
 * 多條件查詢取值,根據某id,獲取實體對象列表,的deName值,並且deName=‘t’的對象集合
 * 原解法:
 */
List<DemoEntity> resultByIdStrName = new ArrayList();
for (DemoEntity d : demoEntityList) {
    if ("id".equals(d.getId())) {
        if ("t".equals(d.getDeName())) {
            resultByIdStrName.add(d);
        }
    }
}
//改進:
demoEntityList.parallelStream().filter(demoEntity -> 		
		"id".equals(demoEntity.getId())).filter(demoEntity -> "t".equals(demoEntity.getDeName()))
		.collect(Collectors.toList());

/**
 * *******場景四:*******
 * 刪除集合內,某個字段值
 * 原解法:
 */
for (DemoEntity d : demoEntityList) {
    if ("id".equals(d.getId())) {
        d.setDeAge(null);
        d.setDeName(null);
    }
}
//改進:
demoEntityList.parallelStream().peek(demoEntity -> {
    demoEntity.setDeName(null);
    demoEntity.setDeAge(null);
}).collect(Collectors.toList());

/**
 * 改進場景:更換id爲“1”的名稱爲“t”
 */
demoEntityList.parallelStream().peek(demoEntity -> {
    if ("1".equals(demoEntity.getId())) {
        demoEntity.setDeName("t");
    }
}).collect(Collectors.toList());

看着改進場景,這樣寫,代碼是不是看起來,清清爽爽一目瞭然。

這裏產生了一個嚴重問題:

之前我們的for循環,是一條條執行循環內的數據

stream.parallel.forEach()被我們程爲流,多線程,並非安全線程,

一定注意…循環更新刪除,數據謹記加鎖操作。。

over,改進寫法完成。。。😅

發佈了91 篇原創文章 · 獲贊 64 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章