Java8 新特性中的流,通常是对list进行操作,并且通常会配合lambda、方法引用语法,
流操作通常有两种可能,示例如下:
1.获取对象的属性,并操作,返回属性的新的list
/**
* 获取list中的某个属性,并处理
* 获取formSources 中的formId属性,去除空值, 去重,倒序,取前12个,形成新的list<Long>
*/
List<Long> formIds = formSources.stream()
.filter(formSource -> formSource != null) // lambda排空
.map(FormSource::getFormId) // map:限制流中的元素为formId属性(后续操作对象)
.filter(formId -> formId != null) // 排空
.distinct() // 去重
.sorted(Comparator.reverseOrder()) // 排序
.limit(12)
.collect(Collectors.toList());
2.直接操作原list,操作对象的某个属性,后,返回原对象的list
/**
* 直接对list 进行操作
* 对formSource中的FormSource,formId为空的去除当前对象,具有相同的formId的去重,按formId倒序排序,后返回新的list
*/
List<FormSource> sortedFormSource = formSources.stream()
.filter(formSource -> formSource != null) // 排空
.filter(formSource -> formSource.getFormId() != null) // 排空
.sorted(Comparator.comparing(FormSource::getFormId).reversed()) // 排序
.collect(Collectors //根据属性去重
.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(o -> {
return o.getFormId();
}))), ArrayList::new));
3.经典实例
亲测可用
3.1打印对象的某个属性
/**
* 打印PostRuleData 的postRuleId属性;
* @param args
*/
public static void main(String[] args) {
List<PostRuleData> listData = new ArrayList<>();
for (int i = 0; i < 10; i++) {
PostRuleData postRuleData = new PostRuleData();
postRuleData.setPostRuleId(Long.parseLong("" + i));
listData.add(postRuleData);
}
// sout,方式打印
listData.stream().map(PostRuleData::getPostRuleId).forEach(System.out::println);
// 流,打印方式1
listData.stream().forEach(postRuleData -> log.info("对象id=" + postRuleData.getPostRuleId() + "; "));
// 流,打印方式2
listData.stream().map(PostRuleData::getPostRuleId).forEach(id -> log.info("对象id=" + id + "; "));
// 流,同时打印index
listData.stream().forEach(postRuleData -> log.info("第" + listData.indexOf(postRuleData) + "个对象的id=" + postRuleData.getPostRuleId()));
}
3.2根据属性筛选对象
/**
* 获取匹配指定操作类型的后置规则
*
* @param listRule 筛选之前的后置规则
* @param type 当前数据的操作类型
* @return 筛选之后的后置规则
*/
private List<PostRuleVO> getMatchedRule(List<PostRuleVO> listRule, String type) {
/**
* 1. operateType.size()==0,允许
* 2. operateType.contains(),允许
*/
return listRule.stream()
.filter(postRuleVO -> CollectionUtils.isEmpty(postRuleVO.getOperateType()) || postRuleVO.getOperateType().contains(type))
.collect(Collectors.toList());
}
3.3 distinct
/**
* 解析formVo的引用来源
*
* @param formVO formVo
* @return 字段名和该字段引用来源的map
*/
public List<String> getFormLabels(FormVO formVO) {
List<String> labels = new ArrayList<>();
getDataLabels(formVO, labels);
// 去重
return labels.stream().distinct().collect(Collectors.toList());
}
// 可以获取去重后的长度
long l = labels.stream().distinct().count();
// 去重后,拼接输出
String output = labels.stream().distinct().collect(Collectors.joining(","));