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

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


咨詢
建站咨詢
