//需求:给定一个对象列表,使用Java8 流API 按照指定区间进行分组
//使用Java8 流API 按照指定区间进行分组【Java8按区间分组】【Java8按范围分组】
public static void main(String[] args) {
//需求:给定一个对象列表,使用Java8 流API 按照指定区间进行分组,
// 字数为2到5字的为一组,字数为8到9字的为一组,字数大于9字的为一组,并统计每组的数量
//后期需求变更,可能会添加额外的组
List<String> list=new ArrayList<>();
list.add("中国人");
list.add("共产党");
list.add("我是中国人");
list.add("光荣共产党");
list.add("我是中国人我骄傲");
list.add("我是共产党员我自豪");
list.add("我是中国人民解放军团团长");
//// TODO: 2022/1/8
//coding ......
//核心思想是将区间转换为固定且唯一的值,可以是数字、可以是枚举,还可以将逻辑抽取到枚举中,这样就可以愉快的分组了
Map<Integer, Integer> collect = list.stream().collect(Collectors.groupingBy(x -> {
if (2 < x.length() && x.length() <=4) {
return 1;
}
return 2;
}, Collectors.collectingAndThen(Collectors.toList(), x -> x.size())));
System.out.println(collect);
}
//使用Java8 流API 等值分段,每n个为一组
public static void main(String[] args) {
//创建一个指定的数据序列,从0开始,构造列表数据
List<Integer> list = Stream.iterate(0, n -> n + 1).limit(1000).collect(Collectors.toList());
long start = System.currentTimeMillis();
// 每3个为一组
int perGroupNum = 3;
// 切分次数
// int groupCount = (list.size() + perGroupNum - 1) / perGroupNum;
//向上取整,计算多少组
int groupCount = (int) Math.ceil(list.size() / Double.valueOf(perGroupNum));
System.out.printf("分为%s组%n", groupCount);
//可以将构造列表数据的limit 调整为100万 并去掉list中的并行化,看看运行时间的效果
List<List<Integer>> collectList =
Stream.iterate(0, n -> n + 1)
.limit(groupCount)
//对每一组进行并行化处理
.parallel()
//对list进行并行化切片处理【类似分页】
.map(n -> list.stream().skip(n * perGroupNum).limit(perGroupNum).parallel().collect(Collectors.toList()))
.collect(Collectors.toList());
System.out.printf("运行时间:%s%n", System.currentTimeMillis() - start);
System.out.printf("打印结果列表%s%n", collectList);
}
有什么不太懂的欢迎下方讨论