學(xué)習(xí)java如同學(xué)習(xí)武功,代碼規(guī)范就是武功招式,設(shè)計(jì)模式如同內(nèi)功心法。如果你會(huì)幾個(gè)好用的開源工具,就如同學(xué)了幾本武學(xué)秘籍。秘籍雖然好,但是如果沒有用對(duì),分分鐘反傷自己。
化骨綿掌外柔內(nèi)剛,以爆發(fā)勁為主。手法以掌為主,運(yùn)轉(zhuǎn)舒展,動(dòng)作連綿不斷,掌法運(yùn)行成環(huán);勁力內(nèi)蓄剛勁,外現(xiàn)綿柔,爆發(fā)迅猛。
stream就是java中的化骨綿掌。一套連續(xù)不斷地輸出,幫我們攻擊拉滿。
讓我們通過一個(gè)具體的小任務(wù)來看看,stream和普通招式對(duì)比。
我現(xiàn)在需要將integerList中的所有數(shù)字都取平方,并且輸出到resultList
普通招式1 ??????
public class Test20181129 {
List<Integer> integerList = Arrays.asList(1, 2, 3, 4, 5);
@Test
public void test1() {
//用于存放結(jié)果
List<Integer> resultList = new LinkedList<>();
//循環(huán)調(diào)用函數(shù)
for (int i = 0; i < integerList.size(); i++) {
resultList.add(fun(integerList.get(i)));
}
//輸出結(jié)果
System.out.println(resultList);
}
private Integer fun(Integer i) {
return i * i;
}
}
[1, 4, 9, 16, 25]
普通招式2 ??????
public class Test20181129 {
List<Integer> integerList = Arrays.asList(1, 2, 3, 4, 5);
@Test
public void test2() {
//用于存放結(jié)果
List<Integer> resultList = new LinkedList<>();
//循環(huán)調(diào)用函數(shù)
for (Integer integer :integerList) {
resultList.add(fun(integer));
}
//輸出結(jié)果
System.out.println(resultList);
}
private Integer fun(Integer i) {
return i * i;
}
}
[1, 4, 9, 16, 25]
stream ??????????
public class Test20181129 {
List<Integer> integerList = Arrays.asList(1, 2, 3, 4, 5);
@Test
public void test3() {
List<Integer> result = integerList.parallelStream().
map(integer -> integer * integer).
collect(Collectors.toList());
System.out.println(result);
}
}
[1, 4, 9, 16, 25]
好像沒有很厲害嘛,僅僅只是省了幾行代碼而已。
那我們現(xiàn)在讓fun函數(shù)需要消耗點(diǎn)時(shí)間,然后看看不同的方法都要用多少時(shí)間?
普通招式1 節(jié)省時(shí)間 ??
public class Test20181129 {
List<Integer> integerList = Arrays.asList(1, 2, 3, 4, 5);
@Test
public void test1() {
long begin = System.currentTimeMillis();
//用于存放結(jié)果
List<Integer> resultList = new LinkedList<>();
//循環(huán)調(diào)用函數(shù)
for (int i = 0; i < integerList.size(); i++) {
resultList.add(fun(integerList.get(i)));
}
long end = System.currentTimeMillis();
System.out.println("useTime: "+(end-begin));
//輸出結(jié)果
System.out.println(resultList);
}
private Integer fun(Integer i) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return i * i;
}
}
useTime: 5015
[1, 4, 9, 16, 25]
普通招式2 節(jié)省時(shí)間 ??
public class Test20181129 {
List<Integer> integerList = Arrays.asList(1, 2, 3, 4, 5);
@Test
public void test1() {
long begin = System.currentTimeMillis();
//用于存放結(jié)果
List<Integer> resultList = new LinkedList<>();
//循環(huán)調(diào)用函數(shù)
for (Integer integer :integerList) {
resultList.add(fun(integer));
}
long end = System.currentTimeMillis();
System.out.println("useTime: "+(end-begin));
//輸出結(jié)果
System.out.println(resultList);
}
private Integer fun(Integer i) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return i * i;
}
}
useTime: 5009
[1, 4, 9, 16, 25]
stream 節(jié)省時(shí)間 ??????????
public class Test20181129 {
List<Integer> integerList = Arrays.asList(1, 2, 3, 4, 5);
@Test
public void test3() {
long begin = System.currentTimeMillis();
List<Integer> result = integerList.parallelStream().
map(integer -> fun(integer)).
collect(Collectors.toList());
long end = System.currentTimeMillis();
System.out.println(result);
System.out.println("useTime : "+(end-begin));
}
public Integer fun(Integer integer) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return integer * integer;
}
}
useTime : 1087
[1, 4, 9, 16, 25]
在造成相同傷害的基礎(chǔ)上(結(jié)果一致),stream的執(zhí)行時(shí)間只用了 普通招式1和2 的1/5
我們并沒有顯式的去開多線程,但是通過stream這一切就精巧的做完了。
這就是stream的魅力,接下來我會(huì)帶著大家一起看看stream都能幫我們做什么?以及如何避免反傷我們自己。