好吧,我只能想到一个自定义收集器,因为您需要一些以前的状态,但是到目前为止,这还不够简洁(除非您将其隐藏在方法后面):
private static Collector>> diffCollector() {
class Acc {
private Integer previous;
private List> result = new ArrayList<>();
void accumulate(Integer elem) {
if (previous == null) {
previous = elem;
List list = new ArrayList<>();
list.add(previous);
result.add(list);
return;
}
if (elem - previous > 2) {
List oneMore = new ArrayList<>();
oneMore.add(elem);
result.add(oneMore);
previous = elem;
} else {
result.get(result.size() - 1).add(elem);
previous = elem;
}
}
Acc combine(Acc other) {
throw new UnsupportedOperationException("Not for parallel");
}
List> finisher() {
return result;
}
}
return Collector.of(Acc::new, Acc::accumulate, Acc::combine, Acc::finisher);
}
用法将是:
List myList = Arrays.asList(1, 2, 3, 7, 9, 12, 13, 15);
System.out.println(myList.stream().collect(diffCollector()));