java8 set 排序_如何使用java8流对TreeSet的列表进行排序

@ Eugene的答案很甜蜜,因为番石榴很甜.但如果您的类路径中没有Guava,这是另一种方式:

List> list = block.stream()

.flatMap(Set::stream)

.sorted()

.collect(partitioning(3));

首先,我将所有集合平面化为一个流,然后我将所有元素排序,最后,我将整个排序流收集到集合列表中.为此,我正在调用一个使用自定义收集器的辅助方法:

private static Collector>> partitioning(int size) {

class Acc {

int count = 0;

List> list = new ArrayList<>();

void add(T elem) {

int index = count++ / size;

if (index == list.size()) list.add(new LinkedHashSet<>());

list.get(index).add(elem);

}

Acc merge(Acc another) {

another.list.stream().flatMap(Set::stream).forEach(this::add);

return this;

}

}

return Collector.of(Acc::new, Acc::add, Acc::merge, acc -> acc.list);

}

该方法接收每个分区的大小,并使用Acc本地类作为收集器使用的可变结构.在Acc类中,我使用的List将包含LinkedHashSet实例,它将保存流的元素.

Acc类保留已经收集的所有元素的计数.在add方法中,我计算列表的索引并递增此计数,如果列表的该位置没有设置,我会向其添加一个新的空LinkedHashSet.然后,我将元素添加到集合中.

因为我在流上调用sorted()来在收集之前对其元素进行排序,所以我需要使用保留插入顺序的数据结构.这就是为什么我使用ArrayList作为外部列表,使用LinkedHashSet作为内部集合.

合并方法将由并行流使用,以合并两个先前累积的Acc实例.我只是通过委托add方法将收到的Acc实例的所有元素添加到此Acc实例中.

最后,我使用Collector.of基于Acc类的方法创建一个收集器.最后一个参数是一个修整器函数,它只返回Acc实例的列表.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值