使用java流查找第一个免费"索引"

Ern*_*nio 4 java java-8 java-stream

我需要在我的文件系统中找到第一个免费索引,其中包含名称流作为源.

考虑列表:["New2","New4","New0","New1",......]第一个未使用的索引将是3.

int index = 0;
try (IntStream indexes = names.stream()
    .filter(name -> name.startsWith("New"))
    .mapToInt(Integer::parseInt)
    .distinct()
    .sorted())
{
    // I was thinking about making possible indexes stream, removing existig ones from try-with-resource block, and getting .min().
    IntStream.rangeClosed(0, 10)... // Idk what to do.
}
Run Code Online (Sandbox Code Playgroud)

我要求别人帮我找到正确的语法,或提出更好的解决方案.

Hol*_*ger 7

最有效的方法是收集到BitSet:

int first = names.stream()
    .filter(name -> name.startsWith("New"))
    .mapToInt(s -> Integer.parseInt(s.substring(3)))
    .collect(BitSet::new, BitSet::set, BitSet::or).nextClearBit(0);
Run Code Online (Sandbox Code Playgroud)

请注意,这些位本质上是排序的和不同的.此外,总会有一个"免费"索引.如果0在最大数量和最大数量之间没有间隙,则下一个空闲将是最大值+ 1,如果根本没有匹配元素,则下一个空闲将为零.