利用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)工廠方法。