自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

別再問(wèn)問(wèn)JDK的Stream怎么用了好么?面試官

開(kāi)發(fā) 前端
關(guān)于Stream 會(huì)用就好,真到面試問(wèn)到了,知道這些關(guān)鍵字都是干什么用的,也就可以了,如果還有人問(wèn)這個(gè)好幾年前的東西,那么這個(gè)公司好像也沒(méi)有什么進(jìn)去的必要了。你說(shuō)是么?

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ù)叨叨一次,真的是讓面試官給整服氣了。

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é)果集返回,那么代碼肯定是:

List<User> userList = handleUser();
List<User> geUser = new ArrayList<>();
for (User user : userList) {
if (user.getAge() > 20){
geUser.add(user);
}
}

上面的handleUser只是一個(gè)賦值的操作,代碼也放上:

handleUser(){
List<User> 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í)也不難

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

一行代碼,直接來(lái)個(gè)鏈?zhǔn)骄幊?,一行代碼直接篩選出來(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ā)者寫(xiě)的代碼。我們直接來(lái)對(duì)比一下寫(xiě)法上的區(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<String> 中字符串最長(zhǎng)的那個(gè)
String[] strArr = new String[] { "cd", "ab", "ddfa", "sd", "zd" };
List<String> list = Arrays.asList(strArr);
String max = Collections.max(list, new Comparator<String>() {
@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<String>中最長(zhǎng)的字符串

String[] strArr = new String[] { "cd", "ab", "ddfa", "sd", "zd" };
List<String> list = Arrays.asList(strArr);
Optional<String> max = 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)寫(xiě)的方法。

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

List<Integer> numList = 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賦值
List<User> list = getList();
//新的IdList
List<String> Ids = new ArrayList<>();
for (User user: list) {
Ids.add(user.getId());
}

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

List<String> jdk8Ids = 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ō)是么?

責(zé)任編輯:武曉燕 來(lái)源: Java極客技術(shù)
相關(guān)推薦

2020-04-16 08:22:11

HTTPS加解密協(xié)議

2024-08-16 13:59:00

2019-07-10 10:06:24

面試官三次握手四次揮手

2018-09-28 05:25:53

TopK算法代碼

2018-10-28 22:37:00

計(jì)數(shù)排序排序面試

2018-11-01 13:49:23

桶排序排序面試

2018-11-06 11:40:19

時(shí)間復(fù)雜度面試算法

2021-04-30 00:00:50

Semaphore信號(hào)量面試官

2015-08-13 10:29:12

面試面試官

2023-07-05 08:17:38

JDK動(dòng)態(tài)代理接口

2019-04-16 13:30:05

表達(dá)式求值數(shù)據(jù)結(jié)構(gòu)算法

2020-09-24 14:40:55

Python 開(kāi)發(fā)編程語(yǔ)言

2020-04-20 13:11:21

HashMap底層存儲(chǔ)

2021-11-24 10:10:32

axios前端攔截器

2024-07-23 08:21:19

2021-06-08 08:33:23

NodeStream數(shù)據(jù)

2022-05-23 08:43:02

BigIntJavaScript內(nèi)置對(duì)象

2019-01-08 15:11:50

最大值最小值算法

2023-02-08 07:04:20

死鎖面試官單元

2025-04-14 11:41:12

RocketMQ長(zhǎng)輪詢配置
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)