我有如下列表"1", "2", "3", "4", "5", "6", "7"
预期结果必须是

"1 2" "3 4" "5 6" "7"

我弄清楚怎么办到7

我的结果
"1 2" "3 4" "5 6"

我想知道我也可以键入7。

我在过滤器中添加了i -> i == objList.size()-1,但没有提供我想要的东西

有人知道如何解决这个问题吗?
码:
List result = IntStream.range(0, objList.size()-1)
            .filter( i -> i % 2 == 0 || i -> i == objList.size()-1)
            .mapToObj(i -> objList.get(i) + "" + objList.get(i + 1))
            .collect(Collectors.toList());
    result.forEach(i -> System.out.print(" " + i ));

最佳答案

您的第一个探针是IntStream.range(x,y)。此方法期望一个范围在开始时是包含范围,在结束时是不包含范围。由于您通过objList.size()-1(在您的情况下为6)作为范围的末尾,因此输入列表(6)中最后一个String的索引已从IntStream中排除,并且位于该索引的字符串(“7”)没有出现在您的输出中。

static IntStream range(int startInclusive,
                       int endExclusive)

Returns a sequential ordered IntStream from startInclusive (inclusive) to endExclusive (exclusive) by an incremental step of 1.

API Note:

    An equivalent sequence of increasing values can be produced sequentially using a for loop as follows:


         for (int i = startInclusive; i < endExclusive ; i++) { ... }

(Source)

将其更改为IntStream.range(0, objList.size())

另一个问题是.filter( i -> i % 2 == 0 || i -> i == objList.size()-1)无法编译,因为它需要一个lambda表达式,而且您也不需要|| i -> i == objList.size()-1部分(因为数组的最后一个索引6已经是偶数了)。

当然那仍然行不通。如果您解决了这些问题,当i = 6时,objList.get(i + 1)将为您提供ArrayIndexOutOfBoundsException异常。

我对最终问题的解决办法可能不是最优雅的解决方案,但这是我在深夜才想到的经过编译和工作的第一件事。

修复我们终于得到的问题(在最后一行中添加了一些次要格式之后):
import java.util.Arrays;
import java.util.stream.IntStream;
import java.util.stream.Collectors;
import java.util.List;

public class LambdaTest
{
    public static void main (String[] args)
    {
        List<String> objList = Arrays.asList("1", "2", "3", "4", "5", "6", "7");
        List<String> result = IntStream.range(0, objList.size())
            .filter( i -> (i % 2) == 0)
            .mapToObj(i -> (i<objList.size()-1)?(objList.get(i) + " " + objList.get(i + 1)):objList.get(i))
            .collect(Collectors.toList());
        result.forEach(i -> System.out.print("\"" + i + "\" "));
    }
}

我尝试了此代码here并获得了预期的输出。

08-16 18:12