新聞中心
JDK8發(fā)布到現(xiàn)在,已經(jīng)過(guò)了8年的時(shí)間了,但是就是到現(xiàn)在,依然在面試的過(guò)程中,還有人問(wèn)這個(gè) JDK8 里面都優(yōu)化了什么內(nèi)容,對(duì)比 JDK7 來(lái)說(shuō),今天阿粉就再繼續(xù)叨叨一次,真的是讓面試官給整服氣了。

成都創(chuàng)新互聯(lián)公司秉承實(shí)現(xiàn)全網(wǎng)價(jià)值營(yíng)銷的理念,以專業(yè)定制企業(yè)官網(wǎng),做網(wǎng)站、成都網(wǎng)站設(shè)計(jì),重慶小程序開(kāi)發(fā)公司,網(wǎng)頁(yè)設(shè)計(jì)制作,手機(jī)網(wǎng)站制作設(shè)計(jì),成都全網(wǎng)營(yíng)銷幫助傳統(tǒng)企業(yè)實(shí)現(xiàn)“互聯(lián)網(wǎng)+”轉(zhuǎn)型升級(jí)專業(yè)定制企業(yè)官網(wǎng),公司注重人才、技術(shù)和管理,匯聚了一批優(yōu)秀的互聯(lián)網(wǎng)技術(shù)人才,對(duì)客戶都以感恩的心態(tài)奉獻(xiàn)自己的專業(yè)和所長(zhǎng)。
JDK8 的 Stream
JDK8 要說(shuō)牛,那是真的牛,讓你的代碼變的更加的簡(jiǎn)潔,為什么這么說(shuō),那就是因?yàn)?Stream 流的存在。
Stream 是 Java8 中處理集合的關(guān)鍵抽象概念,它可以指定你希望對(duì)集合進(jìn)行的操作,可以執(zhí)行非常復(fù)雜的查找、過(guò)濾和映射數(shù)據(jù)等操作。使用Stream API 對(duì)集合數(shù)據(jù)進(jìn)行操作,就類似于使用 SQL 執(zhí)行的數(shù)據(jù)庫(kù)查詢。也可以使用 Stream API 來(lái)并行執(zhí)行操作。簡(jiǎn)而言之,Stream API 提供了一種高效且易于使用的處理數(shù)據(jù)的方式。
其實(shí)說(shuō)這些話術(shù)類的,都是白搭,最主要的,還得是 Stream 的使用。
Stream的使用
篩選
其實(shí)篩選很簡(jiǎn)單,為什么這么說(shuō)呢,因?yàn)楹Y選,比如我們現(xiàn)在有三個(gè)人,張三,李四,王五,年齡分別是 20 ,22,27,我們要篩選出年齡大于20的人,并且組合成一個(gè)新的結(jié)果集返回,那么代碼肯定是:
ListuserList = handleUser();
ListgeUser = new ArrayList<>();
for (User user : userList) {
if (user.getAge() > 20){
geUser.add(user);
}
}
上面的handleUser只是一個(gè)賦值的操作,代碼也放上:
handleUser(){
List userList = new ArrayList<>();
User user = new User();
user.setId(UUID.randomUUID().toString());
user.setName("張三");
user.setAge(20);
user.setDept("開(kāi)發(fā)部");
userList.add(user);
User user1 = new User();
user1.setId(UUID.randomUUID().toString());
user1.setName("李四");
user1.setAge(22);
user1.setDept("測(cè)試部");
userList.add(user1);
User user2 = new User();
user2.setId(UUID.randomUUID().toString());
user2.setName("王五");
user2.setAge(27);
user2.setDept("財(cái)務(wù)部");
userList.add(user2);
return userList;
} 這時(shí)候,我們獲取到geUser這個(gè)結(jié)果集,就是我們篩選之后的,年齡大于20歲的人的數(shù)據(jù)。
那么如果使用 JDK8 的Stream 怎么來(lái)操作呢?
其實(shí)也不難
ListgeUserStream = userList.stream().filter(e -> e.getAge() > 20).collect(Collectors.toList());
一行代碼,直接來(lái)個(gè)鏈?zhǔn)骄幊蹋恍写a直接篩選出來(lái),二者的結(jié)果都是一樣的,區(qū)別只是在代碼量上面,一個(gè)需要自己創(chuàng)建一個(gè)List 自己來(lái)操作,另外一個(gè),直接不需要自己再創(chuàng)建了,直接在后面的 Collectors 給創(chuàng)建了,也是一種簡(jiǎn)化代碼的方法。
循環(huán)
從這里我們來(lái)看 Stream 的循環(huán),循環(huán) for ,JDK7 和 JDK8 的循環(huán)的本質(zhì),并沒(méi)啥變化,變化的只是開(kāi)發(fā)者寫的代碼。我們直接來(lái)對(duì)比一下寫法上的區(qū)別。
JDK7中的for循環(huán)
for (User user : collect) {
System.out.println("年齡大于20的人是:"+user.getName());
}
JDK8的for循環(huán)
collect.stream().forEach(vo->{
System.out.println("年齡大于20的人是:"+vo.getName());
});
循環(huán)區(qū)別好像并不大,看起來(lái)都挺方便的,所以使用什么,全看你自己。
聚合函數(shù)
為什么說(shuō)聚合函數(shù)呢?這個(gè)聚合函數(shù)用的最多的地方,是不是在數(shù)據(jù)庫(kù)中,我們獲取嗎,max,min,count 這些聚合字段的時(shí)候使用到的,如果你想要在程序中篩選,那么避免不了雙層的for循環(huán),然后去循環(huán)比對(duì),或者是通過(guò)Collections 去處理,但是如果你使用 Stream 的話,那就很簡(jiǎn)單了。
//JDK7 獲取List中字符串最長(zhǎng)的那個(gè)
String[] strArr = new String[] { "cd", "ab", "ddfa", "sd", "zd" };
Listlist = Arrays.asList(strArr);
String max = Collections.max(list, new Comparator() {
@Override
public int compare(String o1, String o2) {
if (o1.length() < o2.length()) {
return -1;
}
if (o1.length() == o2.length()) {
return o1.compareTo(o2);
} else {
return 1;
}
}
});
System.out.println(max);
那么如果使用Stream 來(lái)獲取呢?
JDK8獲取List中最長(zhǎng)的字符串
String[] strArr = new String[] { "cd", "ab", "ddfa", "sd", "zd" };
Listlist = Arrays.asList(strArr);
Optionalmax = list.stream().max(Comparator.comparing(String::length));
System.out.println(max.get());
二者返回的結(jié)果也都是一模一樣的,但是代碼量來(lái)說(shuō),就不是一個(gè)層級(jí)了,至少 JDK8 能簡(jiǎn)化了許多的代碼,至少在開(kāi)發(fā)效率上面來(lái)說(shuō),就相對(duì)的比較快了。
min 也是同理,阿粉就不再贅述了,阿粉接下來(lái)說(shuō)說(shuō)這個(gè) count 。一般count都會(huì)在哪些地方使用呢?
count()是獲取流總數(shù)簡(jiǎn)寫的方法。
其實(shí)和size就是一個(gè)意思,但是size我們是不能搭配一些filter使用的,但是count可以呀。
ListnumList = Arrays.asList(42, 44, 43, 41);
//獲取List中大于43的元素的個(gè)數(shù)
long count = numList.stream().filter(e -> e > 43).count();
System.out.println(count);
這么一看,是不是感覺(jué) Stream 里面的方法有時(shí)候也挺有用的,至少在代碼上,能夠讓我們省下來(lái)不少時(shí)間。
Map
其實(shí)還有一些不是那么常用的,比如Map,這個(gè)的用法一般屬于那種,不能夠進(jìn)行連表查詢的情況,就比如我們現(xiàn)在有一個(gè)訂單表,然后訂單表中有關(guān)聯(lián)的付款情況,這個(gè)時(shí)候就可能出現(xiàn),一個(gè)訂單,對(duì)應(yīng)多種付款情況,但是如果要是數(shù)據(jù)量非常大的情況,反而不太適合使用連表的查詢,于是只能先查詢出訂單,然后使用in的方式去查詢付款情況。
我們繼續(xù)用上面的 User 對(duì)象。
JDK7獲取List中的Id數(shù)據(jù):
//給List賦值
Listlist = getList();
//新的IdList
ListIds = new ArrayList<>();
for (User user: list) {
Ids.add(user.getId());
}
JDK8 獲取Id數(shù)據(jù)
Listjdk8Ids = list.stream().map(User::getId).collect(Collectors.toList());
System.out.println("JDK8的獲取數(shù)據(jù)==="+JSON.toJSON(jdk8Ids));
然后我們?cè)谟胕d去查詢指定的數(shù)據(jù)就可以了。
關(guān)于Stream 會(huì)用就好,真到面試問(wèn)到了,知道這些關(guān)鍵字都是干什么用的,也就可以了,如果還有人問(wèn)這個(gè)好幾年前的東西,那么這個(gè)公司好像也沒(méi)有什么進(jìn)去的必要了。你說(shuō)是么?
分享題目:別再問(wèn)問(wèn)JDK的Stream怎么用了好么?面試官
URL網(wǎng)址:http://m.5511xx.com/article/coccpjd.html


咨詢
建站咨詢
