<分区>
在我接触 Java 8 流的过程中,以下练习阻止了我。
Given the
IntStream.range(0, 6)
. Produce the String Stream below:"0, 1" "1, 2" "2, 3" "3, 4" "4, 5"
我想到了使用 Collectors.collectAndThen 将它传递给好的旧列表或数组并循环构造字符串列表,如下所示:
List<String> strgs = new ArrayList<>();
String prev = String.valueOf(nums[0]);
for (int i = 1; i < nums.length; i++) {
strgs.add(prev+", "+String.valueOf(nums[i]));
prev = String.valueOf(nums[i]);
}
但它没有使用流的力量。我感觉就像 Venkat Subramaniam 说的那样:“之后我想洗个澡”。 我想知道如何应用功能技术,这样我就可以在编码后跳过淋浴!
此外,我想避免像 StreamEx 或 JavaRx 这样的库,我想坚持使用普通的 Java 8 API。
编辑:
@Tunaki,感谢您指出我问题中措辞不明确的地方。它是由 Stream 的两个连续元素组成的一对。更具体地说,像 [1, 3, 5, 7, 9, ...]
这样的 Stream 将是
"1, 3"
"3, 5"
"5, 7"
...
编辑2
在向所有答案致敬之后,尽管我的问题与 Tunaki 指出的另一个问题重复。我想针对 Bohemian 提供的答案展开社区讨论。尽管有些人不喜欢他的回答,但它提出了一个严重的问题,即具有副作用的 reduce 操作。我对社区的要求是为该问题提供合理的反有效技术。因此,我想按如下方式重用 Bohemian 答案:
Given the input: nums =new int[]{1,3,5,7,9}
请考虑以下代码段:
List<CharSequence> stringList = new ArrayList<>();
IntBinaryOperator reductionWithSideEffect = (int left, int right) -> {
stringList.add(new StringBuilder().append(left).append(", ").append(right));
return right;
};
Arrays.stream(nums)
.reduce(reductionWithSideEffect);
System.out.println(String.join(", ", stringList));