我正在尝试使用Java 8的lambda/streams解决方案来计算正则表达式模式的匹配次数。例如,对于这个模式/matcher:
final Pattern pattern = Pattern.compile("\\d+");
final Matcher matcher = pattern.matcher("1,2,3,4");
有一种方法叫做splitAsStream
,它会按照给定的模式分割文本,而不是匹配模式。虽然这种方法很优雅并且保持了不可变性,但它并不总是正确的:
// count is 4, correct
final long count = pattern.splitAsStream("1,2,3,4").count();
// count is 0, wrong
final long count = pattern.splitAsStream("1").count();
我还尝试了滥用IntStream
的方法。问题在于,我必须猜测我需要调用matcher.find()
多少次,而不是一直调用直到返回false。
final long count = IntStream
.iterate(0, i -> matcher.find() ? 1 : 0)
.limit(100)
.sum();
我熟悉传统的解决方案:while (matcher.find()) count++;
其中 count
是可变的。是否有一种使用Java 8 lambdas/streams 的简单方法来完成这个功能?
takeWhile
:https://dev59.com/YmIi5IYBdhLWcg3w_QmH#20765715 - TunakitakeWhile
看起来非常有趣。但显然它只能在 Java 9 中使用,而不是 Java 8。 - Manos NikolaidissplitAsStream
做什么以及为什么它不按我使用的方式工作。我刚刚尝试了你的建议来否定模式,惊讶地看到对于"1,2,3,4"
和"1"
都得到了正确的结果。你想发表回答吗? - Manos Nikolaidis