我有如下列表"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并获得了预期的输出。