stream的常用用法
1.排序
//list 根据对象属性排序
List<Clue> clueList = clueList.stream().sorted(new Comparator<Clue>() {
@Override
public int compare(LzdaClue o1, LzdaClue o2) {
Date d1 = DateUtils.parseDateFormat(o1.getSlsj());
Date d2 = DateUtils.parseDateFormat(o2.getSlsj());
//正序
//return d1.compareTo(d2);
//倒序
return d2.compareTo(d1);
}
}).collect(Collectors.toList());
// 按照 list 里的 id 来排序 targetList
public void setListOrder(List<Long> list, List<AppManage> targetList) {
Collections.sort(targetList, ((o1, o2) -> {
int io1 = list.indexOf(o1.getId());
int io2 = list.indexOf(o2.getId());
if (io1 != -1) {
io1 = targetList.size() - io1;
}
if (io2 != -1) {
io2 = targetList.size() - io2;
}
return io2 - io1;
}));
}
2.去重
//list 根据对象属性去重
List<Object> newList = new ArrayList<>();
List<Object> caseList= new ArrayList<>();
caseList.stream().filter((c)->c.getJasj()!=null&&!"".equals(c.getJasj()))
.filter(distinctByKey(c -> c.getCardNo())) //filter保留true的值
.forEach(newList::add);
private static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
Map<Object,Boolean> seen = new ConcurrentHashMap<>();
//putIfAbsent方法添加键值对,如果map集合中没有该key对应的值,则直接添加,并返回null,如果已经存在对应的值,则依旧为原来的值。
//如果返回null表示添加数据成功(不重复),不重复(null==null :TRUE)
return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
}
//list 根据对象多个属性去重
List<Object> list = oneList.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(one -> one.getName1() + ";" + one.getName2() + ";" + one.getName3()))), ArrayList::new));
3.过滤
//根据对象年龄(时间)属性过滤
List<PersonalBasic> nl20and30 = basicList.stream().filter((b) ->
DateUtils.parseDateFormat(b.getBirthday(), DateUtils.dayDateFormat2).before(DateUtils.decreaseYear(date, 20))
&& DateUtils.parseDateFormat(b.getBirthday(), DateUtils.dayDateFormat2).after(DateUtils.decreaseYear(date, 30)))
.collect(Collectors.toList());
List<PersonalBasic> nl31and40 = basicList.stream().filter((b) ->
DateUtils.parseDateFormat(b.getBirthday(), DateUtils.dayDateFormat2).before(DateUtils.decreaseYear(date, 31))
&& DateUtils.parseDateFormat(b.getBirthday(), DateUtils.dayDateFormat2).after(DateUtils.decreaseYear(date, 40)))
.collect(Collectors.toList());