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;
}
});