成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

別再問問JDK的Stream怎么用了好么?面試官

開發 前端
關于Stream 會用就好,真到面試問到了,知道這些關鍵字都是干什么用的,也就可以了,如果還有人問這個好幾年前的東西,那么這個公司好像也沒有什么進去的必要了。你說是么?

JDK8發布到現在,已經過了8年的時間了,但是就是到現在,依然在面試的過程中,還有人問這個 JDK8 里面都優化了什么內容,對比 JDK7 來說,今天阿粉就再繼續叨叨一次,真的是讓面試官給整服氣了。

JDK8 的 Stream

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

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

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

Stream的使用

篩選

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

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

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

handleUser(){
List<User> userList = new ArrayList<>();
User user = new User();
user.setId(UUID.randomUUID().toString());
user.setName("張三");
user.setAge(20);
user.setDept("開發部");
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這個結果集,就是我們篩選之后的,年齡大于20歲的人的數據。

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

其實也不難

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

一行代碼,直接來個鏈式編程,一行代碼直接篩選出來,二者的結果都是一樣的,區別只是在代碼量上面,一個需要自己創建一個List 自己來操作,另外一個,直接不需要自己再創建了,直接在后面的 Collectors 給創建了,也是一種簡化代碼的方法。

循環

從這里我們來看 Stream 的循環,循環 for ,JDK7 和 JDK8 的循環的本質,并沒啥變化,變化的只是開發者寫的代碼。我們直接來對比一下寫法上的區別。

JDK7中的for循環
for (User user : collect) {
System.out.println("年齡大于20的人是:"+user.getName());
}

JDK8的for循環
collect.stream().forEach(vo->{
System.out.println("年齡大于20的人是:"+vo.getName());
});

循環區別好像并不大,看起來都挺方便的,所以使用什么,全看你自己。

聚合函數

為什么說聚合函數呢?這個聚合函數用的最多的地方,是不是在數據庫中,我們獲取嗎,max,min,count 這些聚合字段的時候使用到的,如果你想要在程序中篩選,那么避免不了雙層的for循環,然后去循環比對,或者是通過Collections 去處理,但是如果你使用 Stream 的話,那就很簡單了。

//JDK7 獲取List<String> 中字符串最長的那個
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 來獲取呢?

JDK8獲取List<String>中最長的字符串

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());

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

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

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

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

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

//獲取List中大于43的元素的個數

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

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

Map

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

我們繼續用上面的 User 對象。

JDK7獲取List中的Id數據:

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

JDK8 獲取Id數據

List<String> jdk8Ids = list.stream().map(User::getId).collect(Collectors.toList());
System.out.println("JDK8的獲取數據==="+JSON.toJSON(jdk8Ids));

然后我們在用id去查詢指定的數據就可以了。

關于Stream 會用就好,真到面試問到了,知道這些關鍵字都是干什么用的,也就可以了,如果還有人問這個好幾年前的東西,那么這個公司好像也沒有什么進去的必要了。你說是么?

責任編輯:武曉燕 來源: Java極客技術
相關推薦

2020-04-16 08:22:11

HTTPS加解密協議

2024-08-16 13:59:00

2019-07-10 10:06:24

面試官三次握手四次揮手

2018-09-28 05:25:53

TopK算法代碼

2018-11-01 13:49:23

桶排序排序面試

2018-10-28 22:37:00

計數排序排序面試

2018-11-06 11:40:19

時間復雜度面試算法

2015-08-13 10:29:12

面試面試官

2020-09-24 14:40:55

Python 開發編程語言

2021-04-30 00:00:50

Semaphore信號量面試官

2023-07-05 08:17:38

JDK動態代理接口

2019-04-16 13:30:05

表達式求值數據結構算法

2021-11-24 10:10:32

axios前端攔截器

2020-04-20 13:11:21

HashMap底層存儲

2024-07-23 08:21:19

2021-06-08 08:33:23

NodeStream數據

2022-05-23 08:43:02

BigIntJavaScript內置對象

2019-12-17 09:29:02

數據庫架構分庫分表

2019-01-08 15:11:50

最大值最小值算法

2025-04-14 11:41:12

RocketMQ長輪詢配置
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品美女久久久久久不卡 | 91视频一88av | 久久久久久国 | 色99视频 | 亚洲成人一区二区三区 | 日韩网站免费观看 | 久久精品欧美一区二区三区不卡 | 久久久青草婷婷精品综合日韩 | 欧美日韩国产中文字幕 | 国产专区在线 | 亚洲视频免费在线观看 | 亚洲国产精品久久 | 国产精品国产三级国产aⅴ入口 | 国产精品亚洲欧美日韩一区在线 | 草草草影院 | 日本三级全黄三级三级三级口周 | 国产欧美日韩精品在线观看 | 久草精品在线 | 女同videos另类 | 国产精品99久 | av国产精品毛片一区二区小说 | 亚洲精品福利在线 | 成人深夜福利 | 亚洲日韩中文字幕 | 欧美日韩高清在线观看 | 欧美色综合一区二区三区 | 久久精品一 | 日韩中文字幕在线视频 | 欧美精品一二三 | 国产伦精品一区二区三区四区视频 | 韩国精品一区 | 久久91精品国产一区二区 | 国产精品久久 | 国产精品一区二区在线 | 日韩精品一区二区三区 | 成人免费毛片在线观看 | 一区二区免费在线视频 | 超碰美女在线 | 国产精品国产亚洲精品看不卡15 | 中文字幕福利 | 国产精品精品 |