Java中常用的Lambda表達(dá)式案例解析
前言:
我們?nèi)粘9ぷ髦校?code>Lambda 使用比較多的場(chǎng)景,就是集合類下的 Lambda 流操作,往往幾行代碼可以幫助我們實(shí)現(xiàn)復(fù)雜代碼
接下來(lái)我們把 Lambda 流的常用方法用案列講解一下。
1、ForEach
集合的遍歷forEach方法:
public void testForEach(){
List<String> list = new ArrayList<String>() {{
add("1");
add("2");
add("3");
}};
list.forEach(s-> System.out.println(s));
}2、Collect
將操作后的對(duì)象轉(zhuǎn)化為新的對(duì)象
public void testCollect(){
List<String> list = new ArrayList<String>() {{
add("1");
add("2");
add("2");
}};
//轉(zhuǎn)換為新的list
List newList = list.stream().map(s -> Integer.valueOf(s)).collect(Collectors.toList());
}3、Filter
Filter 為過(guò)濾的意思,只要滿足 Filter 表達(dá)式的數(shù)據(jù)就可以留下來(lái),不滿足的數(shù)據(jù)被過(guò)濾掉
public void testFilter() {
List<String> list = new ArrayList<String>() {{
add("1");
add("2");
add("3");
}};
list.stream()
// 過(guò)濾掉我們希望留下來(lái)的值
// 表示我們希望字符串是 1 能留下來(lái)
// 其他的過(guò)濾掉
.filter(str -> "1".equals(str))
.collect(Collectors.toList());
}4、Map
map 方法可以讓我們進(jìn)行一些流的轉(zhuǎn)化,比如原來(lái)流中的元素是 A,通過(guò) map 操作,可以使返回的流中的元素是 B
public void testMap() {
List<String> list = new ArrayList<String>() {{
add("1");
add("2");
add("3");
}};
//通過(guò) map 方法list中元素轉(zhuǎn)化成 小寫(xiě)
List<String> strLowerList = list.stream()
.map(str -> str.toLowerCase())
.collect(Collectors.toList());
}5、MapToInt
mapToInt 方法的功能和 map 方法一樣,只不過(guò) mapToInt 返回的結(jié)果已經(jīng)沒(méi)有泛型,已經(jīng)明確是 int 類型的流了,源碼如下:
public void testMapToInt() {
List<String> list = new ArrayList<String>() {{
add("1");
add("2");
add("3");
}};
list.stream()
.mapToInt(s->Integer.valueOf(s))
// 一定要有 mapToObj,因?yàn)?mapToInt 返回的是 IntStream,因?yàn)橐呀?jīng)確定是 int 類型了
// 所有沒(méi)有泛型的,而 Collectors.toList() 強(qiáng)制要求有泛型的流,所以需要使用 mapToObj
// 方法返回有泛型的流
.mapToObj(s->s)
.collect(Collectors.toList());
list.stream()
.mapToDouble(s->Double.valueOf(s))
// DoubleStream/IntStream 有許多 sum(求和)、min(求最小值)、max(求最大值)、average(求平均值)等方法
.sum();
}6、Distinct
distinct 方法有去重的功能
public void testDistinct(){
List<String> list = new ArrayList<String>() {{
add("1");
add("2");
add("2");
}};
list.stream()
.map(s -> Integer.valueOf(s))
.distinct()
.collect(Collectors.toList());
}7、Sorted
Sorted 方法提供了排序的功能,并且允許我們自定義排序
public void testSorted(){
List<String> list = new ArrayList<String>() {{
add("1");
add("2");
add("3");
}};
list.stream()
.map(s -> Integer.valueOf(s))
// 等同于 .sorted(Comparator.naturalOrder()) 自然排序
.sorted()
.collect(Collectors.toList());
// 自定義排序器
list.stream()
.map(s -> Integer.valueOf(s))
// 反自然排序
.sorted(Comparator.reverseOrder())
.collect(Collectors.toList());
}8、groupingBy
groupingBy 是能夠根據(jù)字段進(jìn)行分組,toMap 是把 List 的數(shù)據(jù)格式轉(zhuǎn)化成 Map 的格式
public void testGroupBy(){
List<String> list = new ArrayList<String>() {{
add("1");
add("2");
add("2");
}};
Map<String, List<String>> strList = list.stream().collect(Collectors.groupingBy(s -> {
if("2".equals(s)) {
return "2";
}else {
return "1";
}
}));
}9、FindFirst
findFirst 表示匹配到第一個(gè)滿足條件的值就返回
public void testFindFirst(){
List<String> list = new ArrayList<String>() {{
add("1");
add("2");
add("2");
}};
list.stream()
.filter(s->"2".equals(s))
.findFirst()
.get();
// 防止空指針
list.stream()
.filter(s->"2".equals(s))
.findFirst()
// orElse 表示如果 findFirst 返回 null 的話,就返回 orElse 里的內(nèi)容
.orElse("3");
Optional<String> str= list.stream()
.filter(s->"2".equals(s))
.findFirst();
// isPresent 為 true 的話,表示 value != null
if(str.isPresent()){
return;
}
}10、Reduce
reduce 方法允許我們?cè)谘h(huán)里面疊加計(jì)算值
public void testReduce(){
List<String> list = new ArrayList<String>() {{
add("1");
add("2");
add("3");
}};
list.stream()
.map(s -> Integer.valueOf(s))
// s1 和 s2 表示循環(huán)中的前后兩個(gè)數(shù)
.reduce((s1,s2) -> s1+s2)
.orElse(0);
list.stream()
.map(s -> Integer.valueOf(s))
// 第一個(gè)參數(shù)表示基數(shù),會(huì)從 100 開(kāi)始加
.reduce(100,(s1,s2) -> s1+s2);
}11、Peek
peek 方法很簡(jiǎn)單,我們?cè)?peek 方法里面做任意沒(méi)有返回值的事情,比如打印日志
public void testPeek(){
List<String> list = new ArrayList<String>() {{
add("1");
add("2");
add("3");
}};
list.stream().map(s -> Integer.valueOf(s))
.peek(s -> System.out.println(s))
.collect(Collectors.toList());
}12、Limit
limit 方法會(huì)限制輸出值個(gè)數(shù),入?yún)⑹窍拗频膫€(gè)數(shù)大小
public void testLimit(){
List<String> list = new ArrayList<String>() {{
add("1");
add("2");
add("3");
}};
list.stream()
.map(s -> Integer.valueOf(s))
.limit(2L)
.collect(Collectors.toList());
}13、Max,Min
通過(guò)max、min方法,可以獲取集合中最大、最小的對(duì)象
public void testMaxMin(){
List<String> list = new ArrayList<String>() {{
add("1");
add("2");
add("2");
}};
list.stream().max(Comparator.comparing(s -> Integer.valueOf(s))).get();
list.stream().min(Comparator.comparing(s -> Integer.valueOf(s))).get();
}總結(jié)
本文我們介紹十幾種 Lambda 表達(dá)式常用的方法
懂這些,這樣我們?cè)诠ぷ髦杏龅綇?fù)雜數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)化時(shí),肯定會(huì)得心應(yīng)手了。
到此這篇關(guān)于Java中常用的Lambda表達(dá)式案例解析的文章就介紹到這了,更多相關(guān)Java Lambda表達(dá)式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java?Lambda表達(dá)式常用的函數(shù)式接口
- Java詳細(xì)分析Lambda表達(dá)式與Stream流的使用方法
- Java使用lambda自定義Arrays.sort排序規(guī)則說(shuō)明
- Java中Lambda表達(dá)式的使用詳細(xì)教程
- Java?中的?Lambda?List?轉(zhuǎn)?Map?的多種方法詳解
- Java匿名內(nèi)部類和Lambda(->) 的多種寫(xiě)法總結(jié)
- Java?lambda表達(dá)式與泛型整理總結(jié)
- Java8如何利用Lambda快速生成map、多層嵌套map
- Java分析Lambda表達(dá)式Stream流合并分組內(nèi)對(duì)象數(shù)據(jù)合并
- Java Lambda表達(dá)式詳解
相關(guān)文章
Java?Request獲取請(qǐng)求頭數(shù)據(jù)實(shí)例詳解
在開(kāi)發(fā)中我們經(jīng)常需要獲取用戶IP地址,通過(guò)地址來(lái)實(shí)現(xiàn)一些功能,下面這篇文章主要給大家介紹了關(guān)于Java中Request獲取請(qǐng)求頭數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下2024-01-01
Java實(shí)現(xiàn)文件復(fù)制及文件夾復(fù)制幾種常用的方式
這篇文章主要給大家介紹了關(guān)于Java實(shí)現(xiàn)文件復(fù)制及文件夾復(fù)制幾種常用的方式,java復(fù)制文件的方式其實(shí)有不少種,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-09-09
Springboot+Shiro+Jwt實(shí)現(xiàn)權(quán)限控制的項(xiàng)目實(shí)踐
如今的互聯(lián)網(wǎng)已經(jīng)成為前后端分離的時(shí)代,所以本文在使用SpringBoot整合Shiro框架的時(shí)候會(huì)聯(lián)合JWT一起搭配使用,具有一定的參考價(jià)值,感興趣的可以了解一下2023-09-09
Java利用Jackson序列化實(shí)現(xiàn)數(shù)據(jù)脫敏
這篇文章主要介紹了利用Jackson序列化實(shí)現(xiàn)數(shù)據(jù)脫敏,首先在需要進(jìn)行脫敏的VO字段上面標(biāo)注相關(guān)脫敏注解,具體實(shí)例代碼文中給大家介紹的非常詳細(xì),需要的朋友可以參考下2021-10-10
關(guān)于TransmittableThreadLocal線程池中線程復(fù)用問(wèn)題的解決方案
這篇文章主要介紹了關(guān)于TransmittableThreadLocal線程池中線程復(fù)用問(wèn)題的解決方案,線程池復(fù)用線程,如果子線程執(zhí)行完未移除上下文,則會(huì)導(dǎo)致后續(xù)線程可以取到之前線程設(shè)置的屬性,需要的朋友可以參考下2023-11-11

