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 為過濾的意思,只要滿足 Filter 表達(dá)式的數(shù)據(jù)就可以留下來(lái),不滿足的數(shù)據(jù)被過濾掉
public void testFilter() {
List<String> list = new ArrayList<String>() {{
add("1");
add("2");
add("3");
}};
list.stream()
// 過濾掉我們希望留下來(lái)的值
// 表示我們希望字符串是 1 能留下來(lái)
// 其他的過濾掉
.filter(str -> "1".equals(str))
.collect(Collectors.toList());
}4、Map
map 方法可以讓我們進(jìn)行一些流的轉(zhuǎn)化,比如原來(lái)流中的元素是 A,通過 map 操作,可以使返回的流中的元素是 B
public void testMap() {
List<String> list = new ArrayList<String>() {{
add("1");
add("2");
add("3");
}};
//通過 map 方法list中元素轉(zhuǎn)化成 小寫
List<String> strLowerList = list.stream()
.map(str -> str.toLowerCase())
.collect(Collectors.toList());
}5、MapToInt
mapToInt 方法的功能和 map 方法一樣,只不過 mapToInt 返回的結(jié)果已經(jīng)沒有泛型,已經(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 類型了
// 所有沒有泛型的,而 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 開始加
.reduce(100,(s1,s2) -> s1+s2);
}11、Peek
peek 方法很簡(jiǎn)單,我們?cè)?peek 方法里面做任意沒有返回值的事情,比如打印日志
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
通過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ì)教程
- JDK8的lambda方式List轉(zhuǎn)Map的操作方法
- Java匿名內(nèi)部類和Lambda(->) 的多種寫法總結(jié)
- Java?lambda表達(dá)式與泛型整理總結(jié)
- Java8如何利用Lambda快速生成map、多層嵌套map
- Java分析Lambda表達(dá)式Stream流合并分組內(nèi)對(duì)象數(shù)據(jù)合并
- Java Lambda表達(dá)式詳解
相關(guān)文章
Java實(shí)現(xiàn)布隆過濾器的幾種方式總結(jié)
這篇文章給大家總結(jié)了幾種Java實(shí)現(xiàn)布隆過濾器的方式,手動(dòng)硬編碼實(shí)現(xiàn),引入Guava實(shí)現(xiàn),引入hutool實(shí)現(xiàn),通過redis實(shí)現(xiàn)等幾種方式,文中有詳細(xì)的代碼和圖解,需要的朋友可以參考下2023-07-07
關(guān)于springboot整合swagger問題及解決方法
這篇文章主要介紹了關(guān)于springboot整合swagger問題及解決方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04
java從mysql導(dǎo)出數(shù)據(jù)的具體實(shí)例
這篇文章主要介紹了java從mysql導(dǎo)出數(shù)據(jù)的具體實(shí)例,有需要的朋友可以參考一下2013-12-12
Java concurrency之AtomicLongFieldUpdater原子類_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
AtomicLongFieldUpdater可以對(duì)指定"類的 'volatile long'類型的成員"進(jìn)行原子更新。它是基于反射原理實(shí)現(xiàn)的。下面通過本文給大家分享Java concurrency之AtomicLongFieldUpdater原子類的相關(guān)知識(shí),感興趣的朋友一起看看吧2017-06-06

