是否可以在流中获取下一个元素?

我正在尝试将一个转换为功能代码。我需要展望一个值,也要看一个值的背后。是否可以使用流?下面的代码是将罗马文本转换为数值。不确定具有两个/三个参数的 reduce 方法是否能在这里提供帮助。for loop

int previousCharValue = 0;
int total = 0;
    
for (int i = 0; i < input.length(); i++) {
    char current = input.charAt(i);
        
    RomanNumeral romanNum = RomanNumeral.valueOf(Character.toString(current));
        
    if (previousCharValue > 0) { 
        total += (romanNum.getNumericValue() - previousCharValue);
        previousCharValue = 0;
    } else {
        if (i < input.length() - 1) {
        
            char next = input.charAt(i + 1);
            RomanNumeral nextNum = RomanNumeral.valueOf(Character.toString(next));
            if (romanNum.getNumericValue() < nextNum.getNumericValue()) {
                previousCharValue = romanNum.getNumericValue();
            }
        }
        if (previousCharValue == 0) {
            total += romanNum.getNumericValue();
        }
            
    }
        
}

答案 1

不,使用流这是不可能的,至少不容易。流 API 从元素的处理顺序中抽象出来:流可以并行处理,也可以按相反的顺序处理。因此,流抽象中不存在“下一个元素”和“上一个元素”。

您应该使用最适合这项工作的API:如果您需要对集合的所有元素应用一些操作并且对顺序不感兴趣,则流非常出色。如果需要按特定顺序处理元素,则必须使用迭代器或通过索引访问列表元素。


答案 2

我还没有看到流这样的用例,所以我不能说它是否可能。但是当我需要使用带有索引的流时,我选择 ,然后在 lambdas 中,我从此表/列表中获取值。IntStream#range(0, table.length)

例如

    int[] arr = {1,2,3,4};
    int result = IntStream.range(0, arr.length)
            .map(idx->idx>0 ? arr[idx] + arr[idx-1]:arr[idx])
            .sum();