JDK8关于集合类的操作

JDK8的新特性对集合类的操作封装比较多,比如stream流,lam表达式等!

一、对集合进行过滤

例如对集合List中的MyTestModel中的age属性进行去重

List<MyTestModel> data = new ArrayList<>();

data = data.stream().filter(distinctByKey(MyTestModel::getAge)).collect(Collectors.toList());

//Map集合也一样,方式如下
//special = special.stream().filter(CollectUtils.distinctByKey(e -> e.get("memberId").toString())).collect(Collectors.toList());

private static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
    //方式一
    Set<Object> temp = new HashSet<>();
    return t -> temp.add(keyExtractor.apply(t));
        
    //方式二
    Map<Object,Boolean> seen = new ConcurrentHashMap<>();
    return  t -> (seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null);
}

对List中对象进行分组(key为去重的数据)

List<User> tempList = Lists.newArrayList();
User user = new User();
User user1 = new User();
User user2 = new User();

user.setUserName("111");
user1.setUserName("222");
user2.setUserName("111");
tempList.add(user);
tempList.add(user1);
tempList.add(user2);

Map<String, List<User>> map = tempList.stream().collect(Collectors.groupingBy(User::getUserName));

Map<Long, SuperVipDTO> superVipMap = Stream.toMap(superVipDTOS, SuperVipDTO::getMemberId, Function.identity());

Map<String, List<SchoolYearWarnStatisticVO>> map = schoolYearWarnStatisticVOS.stream().collect(Collectors.groupingBy(p -> p.getSchoolName()+"_"+p.getGradeType()));

对List中的主键ID进行去重,取出去重的数据

List<Long> payOrderIdList = tempList.stream().map(t -> t.getId()).distinct().collect(Collectors.toList());

对List转化为Set

Set<Long> allInfoSet = belongList.stream().filter(belong -> belong.getRegionId() == 1).map(CustomerServiceBelong::getCustomerServiceId).collect(Collectors.toSet());
Set<Long> allMemberIdSet = customerServiceInfoList.stream().filter(info -> allInfoSet.contains(info.getId())).map(CustomerServiceInfo::getMemberId).collect(Collectors.toSet());
       
List<Long> list = new ArrayList<>(set);(Set转化为List集合)

二、对集合进行求和

例如对集合List中的MyTestModel中的age属性进行累加

List<MyTestModel> data = new ArrayList<>();
Integer sum= data.stream().collect(Collectors.summingInt(MyTestModel::getAge))

对BigDeccimal进行求和

//BigDecimal对象求和
List<BigDecimal> list = Lists.newArrayList(new BigDecimal("2.34"),new BigDecimal(1.23));
BigDecimal sum = list.stream().reduce(BigDecimal::add).get();

//对象中的某个字段求和
list.stream().map(InOutDetailDto::getPayWorkPoint).reduce(BigDecimal::add).get();

三、取集合中最大的一条记录数

GoodsInfo goodsInfo = vipPayInfo.getGoodsInfo().stream().max(Comparator.comparingLong(GoodsInfo::getFreight)).get();

四、java常见集合相互转化

例如将List<String> 转化为List<Long>

List<Long> orderIds = Arrays.asList(payOrderIds.split(",")).stream().map(s -> Long.parseLong(s.trim())).collect(Collectors.toList());

五、查找其中一个元素

User user1 = userList.stream().filter(user -> "zhangsan".equals(user.getUserName())).findAny().orElse(null);

六、List<Map>进行排序

newData.sort((m1, m2) -> {
   Long l = (Long) m1.get("用户id") - (Long) m2.get("用户id");
   if(l > 0) {
       return 1;
   } else if (l == 0L) {
       return -1;
   } else {
       return -1;
   }
});

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值