日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
別再問問JDK的Stream怎么用了好么?面試官

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

成都創(chuàng)新互聯(lián)公司秉承實(shí)現(xiàn)全網(wǎng)價(jià)值營銷的理念,以專業(yè)定制企業(yè)官網(wǎng),做網(wǎng)站、成都網(wǎng)站設(shè)計(jì),重慶小程序開發(fā)公司,網(wǎng)頁設(shè)計(jì)制作,手機(jī)網(wǎng)站制作設(shè)計(jì),成都全網(wǎng)營銷幫助傳統(tǒng)企業(yè)實(shí)現(xiàn)“互聯(lián)網(wǎng)+”轉(zhuǎn)型升級專業(yè)定制企業(yè)官網(wǎng),公司注重人才、技術(shù)和管理,匯聚了一批優(yōu)秀的互聯(lián)網(wǎng)技術(shù)人才,對客戶都以感恩的心態(tài)奉獻(xiàn)自己的專業(yè)和所長。

JDK8 的 Stream

JDK8 要說牛,那是真的牛,讓你的代碼變的更加的簡潔,為什么這么說,那就是因?yàn)?Stream 流的存在。

Stream 是 Java8 中處理集合的關(guān)鍵抽象概念,它可以指定你希望對集合進(jìn)行的操作,可以執(zhí)行非常復(fù)雜的查找、過濾和映射數(shù)據(jù)等操作。使用Stream API 對集合數(shù)據(jù)進(jìn)行操作,就類似于使用 SQL 執(zhí)行的數(shù)據(jù)庫查詢。也可以使用 Stream API 來并行執(zhí)行操作。簡而言之,Stream API 提供了一種高效且易于使用的處理數(shù)據(jù)的方式。

其實(shí)說這些話術(shù)類的,都是白搭,最主要的,還得是 Stream 的使用。

Stream的使用

篩選

其實(shí)篩選很簡單,為什么這么說呢,因?yàn)楹Y選,比如我們現(xiàn)在有三個(gè)人,張三,李四,王五,年齡分別是 20 ,22,27,我們要篩選出年齡大于20的人,并且組合成一個(gè)新的結(jié)果集返回,那么代碼肯定是:

List userList = handleUser();
List geUser = 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("開發(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("財(cái)務(wù)部");
userList.add(user2);

return userList;

}

這時(shí)候,我們獲取到geUser這個(gè)結(jié)果集,就是我們篩選之后的,年齡大于20歲的人的數(shù)據(jù)。

那么如果使用 JDK8 的Stream 怎么來操作呢?

其實(shí)也不難

List geUserStream = userList.stream().filter(e -> e.getAge() > 20).collect(Collectors.toList());

一行代碼,直接來個(gè)鏈?zhǔn)骄幊?,一行代碼直接篩選出來,二者的結(jié)果都是一樣的,區(qū)別只是在代碼量上面,一個(gè)需要自己創(chuàng)建一個(gè)List 自己來操作,另外一個(gè),直接不需要自己再創(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ù)呢?這個(gè)聚合函數(shù)用的最多的地方,是不是在數(shù)據(jù)庫中,我們獲取嗎,max,min,count 這些聚合字段的時(shí)候使用到的,如果你想要在程序中篩選,那么避免不了雙層的for循環(huán),然后去循環(huán)比對,或者是通過Collections 去處理,但是如果你使用 Stream 的話,那就很簡單了。

//JDK7 獲取List 中字符串最長的那個(gè)
String[] strArr = new String[] { "cd", "ab", "ddfa", "sd", "zd" };
List list = 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" };
List list = Arrays.asList(strArr);
Optional max = list.stream().max(Comparator.comparing(String::length));
System.out.println(max.get());

二者返回的結(jié)果也都是一模一樣的,但是代碼量來說,就不是一個(gè)層級了,至少 JDK8 能簡化了許多的代碼,至少在開發(fā)效率上面來說,就相對的比較快了。

min 也是同理,阿粉就不再贅述了,阿粉接下來說說這個(gè) count 。一般count都會在哪些地方使用呢?

count()是獲取流總數(shù)簡寫的方法。

其實(shí)和size就是一個(gè)意思,但是size我們是不能搭配一些filter使用的,但是count可以呀。

List numList = Arrays.asList(42, 44, 43, 41); 

//獲取List中大于43的元素的個(gè)數(shù)

long count = numList.stream().filter(e -> e > 43).count();
System.out.println(count);

這么一看,是不是感覺 Stream 里面的方法有時(shí)候也挺有用的,至少在代碼上,能夠讓我們省下來不少時(shí)間。

Map

其實(shí)還有一些不是那么常用的,比如Map,這個(gè)的用法一般屬于那種,不能夠進(jìn)行連表查詢的情況,就比如我們現(xiàn)在有一個(gè)訂單表,然后訂單表中有關(guān)聯(lián)的付款情況,這個(gè)時(shí)候就可能出現(xiàn),一個(gè)訂單,對應(yīng)多種付款情況,但是如果要是數(shù)據(jù)量非常大的情況,反而不太適合使用連表的查詢,于是只能先查詢出訂單,然后使用in的方式去查詢付款情況。

我們繼續(xù)用上面的 User 對象。

JDK7獲取List中的Id數(shù)據(jù):

//給List賦值
List list = getList();
//新的IdList
List Ids = new ArrayList<>();
for (User user: list) {
Ids.add(user.getId());
}

JDK8 獲取Id數(shù)據(jù)

List jdk8Ids = 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)鍵字都是干什么用的,也就可以了,如果還有人問這個(gè)好幾年前的東西,那么這個(gè)公司好像也沒有什么進(jìn)去的必要了。你說是么?


網(wǎng)站標(biāo)題:別再問問JDK的Stream怎么用了好么?面試官
本文URL:http://m.5511xx.com/article/coccpjd.html