Java8 快速實現(xiàn)List轉map 、分組、過濾等操作

利用java8新特性,可以用簡潔高效的代碼來實現(xiàn)一些數(shù)據(jù)處理。

定義1個Apple對象:

publicclassApple{

privateInteger?id;

privateString?name;

privateBigDecimal?money;

privateInteger?num;

publicApple(Integer?id,?String?name,?BigDecimal?money,?Integer?num){

this.id?=?id;

this.name?=?name;

this.money?=?money;

this.num?=?num;

}

}

添加一些測試數(shù)據(jù):

List?appleList?=newArrayList<>();//存放apple對象集合

Apple?apple1?=newApple(1,"蘋果1",newBigDecimal("3.25"),10);

Apple?apple12?=newApple(1,"蘋果2",newBigDecimal("1.35"),20);

Apple?apple2?=newApple(2,"香蕉",newBigDecimal("2.89"),30);

Apple?apple3?=newApple(3,"荔枝",newBigDecimal("9.99"),40);

appleList.add(apple1);

appleList.add(apple12);

appleList.add(apple2);

appleList.add(apple3);

1、分組

List里面的對象元素,以某個屬性來分組,例如,以id分組,將id相同的放在一起:

//List?以ID分組?Map<Integer,List<Apple>>

Map>?groupBy?=?appleList.stream().collect(Collectors.groupingBy(Apple::getId));

System.err.println("groupBy:"+groupBy);

{1=[Apple{id=1,?name='蘋果1',?money=3.25,?num=10},?Apple{id=1,?name='蘋果2',?money=1.35,?num=20}],2=[Apple{id=2,?name='香蕉',?money=2.89,?num=30}],3=[Apple{id=3,?name='荔枝',?money=9.99,?num=40}]}

2、List轉Map

id為key,apple對象為value,可以這么做:

/**

*?List?->?Map

*?需要注意的是:

*?toMap?如果集合對象有重復的key,會報錯Duplicate?key?....

*? apple1,apple12的id都為1。

*??可以用?(k1,k2)->k1?來設置,如果有重復的key,則保留key1,舍棄key2

*/

Map?appleMap?=?appleList.stream().collect(Collectors.toMap(Apple::getId,?a?->?a,(k1,k2)->k1));

打印appleMap

{1=Apple{id=1,?name='蘋果1',?money=3.25,?num=10},2=Apple{id=2,?name='香蕉',?money=2.89,?num=30},3=Apple{id=3,?name='荔枝',?money=9.99,?num=40}}

3、過濾Filter

從集合中過濾出來符合條件的元素:

//過濾出符合條件的數(shù)據(jù)

List?filterList?=?appleList.stream().filter(a?->?a.getName().equals("香蕉")).collect(Collectors.toList());

System.err.println("filterList:"+filterList);

[Apple{id=2,?name='香蕉',?money=2.89,?num=30}]

4、求和

將集合中的數(shù)據(jù)按照某個屬性求和:

//計算?總金額

BigDecimal?totalMoney?=?appleList.stream().map(Apple::getMoney).reduce(BigDecimal.ZERO,?BigDecimal::add);

System.err.println("totalMoney:"+totalMoney);//totalMoney:17.48

5、查找流中最大 最小值

Collectors.maxBy 和 Collectors.minBy 來計算流中的最大或最小值。搜索Java知音公眾號,回復“后端面試”,送你一份Java面試題寶典

Optional?maxDish?=?Dish.menu.stream().

collect(Collectors.maxBy(Comparator.comparing(Dish::getCalories)));

maxDish.ifPresent(System.out::println);

Optional?minDish?=?Dish.menu.stream().

collect(Collectors.minBy(Comparator.comparing(Dish::getCalories)));

minDish.ifPresent(System.out::println);

6、去重

import?static?java.util.Comparator.comparingLong;

import?static?java.util.stream.Collectors.collectingAndThen;

import?static?java.util.stream.Collectors.toCollection;

//?根據(jù)id去重

List?unique?=?appleList.stream().collect(

collectingAndThen(

toCollection(()?->?new?TreeSet<>(comparingLong(Apple::getId))),?ArrayList::new)

);

下表展示 Collectors 類的靜態(tài)工廠方法。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容