原文鏈接: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,改進寫法完成。。。😅