java stream max_如何强制max()返回Java Stream中的所有最大值?

我使用自定义下游收集器实现了更通用的收集器解 可能有些读者可能觉得它很有用:public static  Collector maxAll(Comparator super T> comparator,

Collector super T, A, D> downstream) {

Supplier downstreamSupplier = downstream.supplier();

BiConsumer downstreamAccumulator = downstream.accumulator();

BinaryOperator downstreamCombiner = downstream.combiner();

class Container {

A acc;

T obj;

boolean hasAny;

Container(A acc) {

this.acc = acc;

}

}

Supplier supplier = () -> new Container(downstreamSupplier.get());

BiConsumer accumulator = (acc, t) -> {

if(!acc.hasAny) {

downstreamAccumulator.accept(acc.acc, t);

acc.obj = t;

acc.hasAny = true;

} else {

int cmp = comparator.compare(t, acc.obj);

if (cmp > 0) {

acc.acc = downstreamSupplier.get();

acc.obj = t;

}

if (cmp >= 0)

downstreamAccumulator.accept(acc.acc, t);

}

};

BinaryOperator combiner = (acc1, acc2) -> {

if (!acc2.hasAny) {

return acc1;

}

if (!acc1.hasAny) {

return acc2;

}

int cmp = comparator.compare(acc1.obj, acc2.obj);

if (cmp > 0) {

return acc1;

}

if (cmp 

return acc2;

}

acc1.acc = downstreamCombiner.apply(acc1.acc, acc2.acc);

return acc1;

};

Function finisher = acc -> downstream.finisher().apply(acc.acc);

return Collector.of(supplier, accumulator, combiner, finisher);}

所以默认情况下可以收集列表:public static  Collector> maxAll(Comparator super T> comparator) {

return maxAll(comparator, Collectors.toList());}

但您也可以使用其他下游收集器:public static String joinLongestStrings(Collection input) {

return input.stream().collect(

maxAll(Comparator.comparingInt(String::length), Collectors.joining(","))));}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值