【发布时间】:2019-06-16 14:08:10
【问题描述】:
我在下面的代码中使用了嵌套的 for 循环,并且我有一些条件破坏了内部 for 循环,这提高了该代码的性能。
public static int getMaxValue(List<Integer> list) {
int result = -1;
for(int i=0; i<list.size(); i++) {
for(int j=i+1; j<list.size(); j++) {
if(list.get(j) - list.get(i) <= 0) break;
if(list.get(j) - list.get(i) > result) {
result = list.get(j) - list.get(i);
}
}
}
return result;
}
现在如何使用 Java 8 流来执行相同的逻辑?我想出了以下代码:
public static int getMaxValue(List<Integer> list) {
int[] result = { -1 };
IntStream.range(0, list.size()).forEach(i -> {
IntStream.range(i + 1, list.size()).forEach(j -> {
if(list.get(j) - list.get(i) <= 0) return;
if(list.get(j) - list.get(i) > result[0]) {
result[0] = list.get(j) - list.get(i);
}
});
});
return result[0];
}
这里我不能在 java 流中使用 break 语句,所以我使用了 return 语句,但它仍然运行内部循环,因为它不会破坏它,性能没有提高。
【问题讨论】:
-
在您的原始代码中,break 不会停止外循环。不确定您认为它在做什么,但它可能没有按照您的想法做。
-
为什么要使用流?听起来简单的
for循环版本可以满足您的需求,那么为什么要更改它呢? -
我正试图准确了解您的循环在做什么。如果你只是想在列表中找到最大值,你可以做
list.stream().max()。您不需要 O(n²) 算法。 -
@jbx,我说的是只打破内部循环,而不是外部循环。
I have some condition that breaks the inner for loop -
@DanielPryden,我只是想看看在这种情况下如何使用流进行学习。