Ris*_*are 2 java java-8 java-stream
我有一段使用传统for循环编写的代码,如下所示.我想重构它以使用java 8流并删除for循环.以下代码的输出应为3,因为这是最长的连续数字列表(4,5和6)
List<Integer> weekDays = Lists.newArrayList(1, 2, 4, 5, 6);
List<Integer> consecutiveIntervals = Lists.newArrayList();
int maxConsecutiveTillNow = 1;
for (int i = 1; i < weekDays.size(); i++) {
if (weekDays.get(i) - weekDays.get(i - 1) == 1) {
maxConsecutiveTillNow++;
} else {
consecutiveIntervals.add(maxConsecutiveTillNow);
maxConsecutiveTillNow = 1;
}
}
consecutiveIntervals.add(maxConsecutiveTillNow);
System.out.println(consecutiveIntervals.stream()
.max(Integer::compareTo)
.get()
);
Run Code Online (Sandbox Code Playgroud)
该StreamAPI是不是非常适合这类问题.几乎不可能以Stream正确的方式跟踪a的元素.所以你必须去多个Streams.
根据斯图尔特马克斯的答案之一.
List<Integer> weekDays = Arrays.asList(1, 2, 4, 5, 6);
int[] indices = IntStream.rangeClosed(0, weekDays.size())
.filter(i -> i == 0 || i == weekDays.size() || weekDays.get(i - 1) + 1 != weekDays.get(i))
.toArray();
int longest = IntStream.range(0, indices.length - 1).map(i -> indices[i + 1] - indices[i])
.max().orElseThrow(NoSuchElementException::new);
System.out.println(longest);
Run Code Online (Sandbox Code Playgroud)
产量
3
| 归档时间: |
|
| 查看次数: |
945 次 |
| 最近记录: |