天天看點

lamda list 分組_lambda表達式分組,過濾,求和,最值,排序,去重

@[TOC]

簡介

java8的lambda表達式提供了一些友善list操作的方法,主要涵蓋分組、過濾、求和、最值、排序、去重。跟之前的傳統寫法對比,能少寫不少代碼。

執行個體

先準備個實體類

import java.math.BigDecimal;

import java.util.Date;

public class User {

private long id;

//姓名

private String name;

//年齡

private int age;

//工号

private String jobNumber;

//性别

private int gender;

//入職日期

private Date entryDate;

//錢

private BigDecimal money;

//省略get set

...

}

分組

通過groupingBy将集合分組拆分成多個集合

//通過年齡分組、得到一個以年齡為鍵,使用者集合為值的Map集合

Map> groupByAge = userList.stream().collect(Collectors.groupingBy(User::getAge));

過濾

通過filter方法可以過濾某些條件

//過濾

//排除掉工号為1001的使用者

//filter内添加條件、保留傳回true的執行個體

List list = userList.stream().filter(user -> !user.getJobNumber().equals("1001")).collect(Collectors.toList());

求和

分基本類型和大數類型求和,基本類型先mapToInt,然後調用sum方法,大數類型使用reduce調用BigDecimal::add方法

//求和

//基本類型

int sumAge = userList.stream().mapToInt(User::getAge).sum();

//BigDecimal求和

BigDecimal totalMoney= userList.stream().map(User::getMoney).reduce(BigDecimal.ZERO, BigDecimal::add);

注意:在上述BigDecimal類型求和中,如果對象為null則會抛出空指針異常

1、我們可以先試用filter方法進行過濾

//先過濾掉為null的

List list = userList.stream().filter(user -> null != user).collect(Collectors.toList());

//再求和

BigDecimal totalMoney = userList.stream().map(User::getMoney).reduce(BigDecimal.ZERO,BigDecimal::add);

2、或者可以重寫求和方法

package com.jamesluozhiwei.util;

import java.math.BigDecimal;

public class BigDecimalUtils {

public static BigDecimal ifNullSet0(BigDecimal in) {

if (in != null) {

return in;

}

return BigDecimal.ZERO;

}

public static BigDecimal sum(BigDecimal ...in){

BigDecimal result = BigDecimal.ZERO;

for (int i = 0; i < in.length; i++){

result = result.add(ifNullSet0(in[i]));

}

return result;

}

}

重寫求和方法後

//使用重寫的方法求和

BigDecimal totalMoney = userList.stream().map(User::getMoney).reduce(BigDecimal.ZERO,BigDecimalUtils::sum);

最值

求最大與最小值,使用min max方法

//最小

Date minEntryDate = userList.stream().map(User::getEntryDate).min(Date::compareTo).get();

//最大

Date maxEntryDate = userList.stream().map(User::getEntryDate).max(Date::compareTo).get();

List轉Map

Map userMap = userList.stream().collect(Collectors.toMap(User::getId, user -> user,(k1,k2)->k1));

排序

可通過Sort對單字段多字段排序

//排序

//單字段排序,根據id排序

userList.sort(Comparator.comparing(User::getId));

//多字段排序,根據id,年齡排序

userList.sort(Comparator.comparing(User::getId).thenComparing(User::getAge));

去重

通過distinct方法進行去重

//去重

List idList = new ArrayList();

idList.add(1L);

idList.add(1L);

idList.add(2L);

List distinctIdList = idList.stream().distinct().collect(Collectors.toList());

擷取list對象某個字段組裝新的list

//擷取list對象的某個字段組裝成新list

List userIdList = userList.stream().map(a -> a.getId()).collect(Collectors.toList());

批量設定list清單字段為同一個值

addList.stream().forEach(a -> a.setMoney("0"));

注意:本文歸作者所有,未經作者允許,不得轉載