使用Lambda统计List嵌套数据

28 篇文章 1 订阅

使用Lambda统计List嵌套数据

场景

之前碰到过这样一种场景,有如下数据(JSON或List对象)

{
	"dataList": [{
		"userInfoList": [{
			"id": 1,
			"idNumber": "1"
		}, {
			"id": 2,
			"idNumber": "2"
		}]
	}, {
		"userInfoList": [{
			"id": 4,
			"idNumber": "3"
		}, {
			"id": 6,
			"idNumber": "2"
		}]
	}]
}

需要统计上述对象中的userInfoList的数量,并且要根据idNumber去重。如上述情况,统计后的total=3

解决方法

将两个List合并,去重,再求数量。

Lambda解决方式

import com.alibaba.fastjson.JSON;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.junit.Test;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

/**
 * @author litong
 * @date 2020/4/29 14:26
 */
public class LamdbaTest {
    @Test
    public void a() {
        UserListRes res = new UserListRes();
        List<UserListDTO> dataList = new ArrayList<>();
        List<UserInfo> userInfoList1 = new ArrayList<>();
        userInfoList1.add(UserInfo.builder().id(1L).idNumber("1").build());
        userInfoList1.add(UserInfo.builder().id(2L).idNumber("2").build());
        List<UserInfo> userInfoList2 = new ArrayList<>();

        userInfoList2.add(UserInfo.builder().id(4L).idNumber("3").build());
        userInfoList2.add(UserInfo.builder().id(6L).idNumber("2").build());

        dataList.add(UserListDTO.builder().userInfoList(userInfoList1).build());
        dataList.add(UserListDTO.builder().userInfoList(userInfoList2).build());
        res.setDataList(dataList);
        int sum = res.getDataList().stream().mapToInt(v -> v.getUserInfoList().size()).sum();
        System.out.println(JSON.toJSONString(res));
        System.out.println(sum);


        // 获取总用户列表
        List<List<UserInfo>> collect = res.getDataList().stream()
                .map(UserListDTO::getUserInfoList).collect(Collectors.toList());

        List<UserInfo> userInfoResList = new ArrayList<>();
        collect.forEach(userInfoResList::addAll);

        // 去重求和
        int size = (int) userInfoResList.stream().distinct().count();

        System.out.println(userInfoResList);
        System.out.println(size);
    }

}

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
class UserListRes {
    private List<UserListDTO> dataList;
    private String total;
}

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
class UserListDTO {
    private List<UserInfo> userInfoList;
    private String total;
}

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
class UserInfo {
    private Long id;
    private String idNumber;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        UserInfo that = (UserInfo) o;

        return Objects.equals(idNumber, that.idNumber);
    }

    @Override
    public int hashCode() {
        return idNumber != null ? idNumber.hashCode() : 0;
    }
}

注意事项

根据去重的标准,我们可以直接重写实体类的equals和hashCode方法。或自行传入去重计算方法。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值