大家好,我想知道如何在断言中放入整个代码块?
例如,我有一个数组,我想对数组的每个值进行断言。这就是我的代码:
for (int value : values) {
assert Within(value, x, y);
}
但是当然如果我运行没有-ea
的程序,断言断言,循环仍然存在。
我想知道如何将整个循环放在断言语句中?
修改
argh dang Java有时太刻板了,我最终做了这样的功能:
assert Every(value, new F1<Boolean, Integer>() {
Boolean Call(Integer value) {
return Within(value, 0, 255);
}
});
答案 0 :(得分:5)
您可以使用方法
public boolean check(int... values) {
for (int value : values)
if(!Within(value, x, y)) return false;
return true;
}
assert check(values);
如果你有很多支票,另一种方法是测试断言
boolean assertEnabled = false;
assert assertEnabled = true;
if (assertEnabled) {
// do lots of checks
}
答案 1 :(得分:4)
只需创建一个检查数组所有元素的方法:
assert allWithin(values, x, y);
...
private boolean allWithin(int[] values, int x, int y) {
for (int value : values) {
if (!within(value, x, y)) {
return false;
}
}
return true;
}
答案 2 :(得分:1)
将for循环解压缩为布尔方法并对其返回值进行断言。
答案 3 :(得分:1)
从 Java 8 开始,您可以选择为此使用 Stream:
assert values.stream().allMatch(value -> within(value, x, y));
(如果 values
是您示例中的数组,请改用 Arrays.stream(values)
。)
答案 4 :(得分:0)
真的有问题吗?据我所知,Java编译器和JVM忽略了等待循环(空循环)。因此,从我的观点来看,无论是否断言整个块都是无关紧要的(最终的二进制文件应该是相同的(没有任何循环))。
修改强>:
这是您的测试代码应该如何确保使用HotSpot
public static void main(String args[]) {
int[] values = new int[10000];
for (int i = 0; i < 1000; i++) {
long a = System.nanoTime();
for (int value : values);
long b = System.nanoTime();
System.out.println(b - a);
}
}