自动更新布尔值
Automatically updating boolean value
完整代码:
http://pastebin.com/UghV3xdT
我有 2 个几乎完全相同的方法,它们只有一个 if 语句不同:if (k % 3 != 1)
和 if(k % 2 == 0)
。
int k = 0;
while(k<50){
if(k % 3 != 1){ // OR if(k % 2 == 0)
// Code logic goes here
k++;
}
}
每个case的使用由Array的长度决定,这意味着特定的case只需要确定1次。 'k'表示另一个数组的索引,50是这个数组的长度。
我可以写类似 if(foo > 1 ? k % 3 != 1 : k % 2 == 0)
的东西,但这需要程序在每次循环运行时执行操作。
在某种程度上,我想要一种更新布尔值。有什么办法可以做到这一点,或者这是按价值传递的缺点吗?我应该保留两个单独的方法还是使用三元运算符更好?
本质上,我正在寻找一种包含表达式而不是值的类型。
您可以创建两个具有相同功能的不同 类,然后使用其中一个。比如循环外:
class A{ bool calc(int n){return n%3 != 1} }
class B{ bool calc(int n){return n%2 == 0} }
Object x = (foo > 1 ? new A():new B());
那么你只能在循环中使用x.calc(k)
。
在Java 8 中有一个很好的功能接口IntPredicate
。如果将它与 lambda 表达式结合使用,您可以在没有重复、额外代码或任何减速的情况下实现您的目标:
public final class Example {
public static void main(String[] args) {
//Instead of randomly choosing the predicate, use your condition here
Random random = new Random();
IntPredicate intPredicate = random.nextBoolean() ? i -> i % 2 == 0 : i -> i % 3 != 1;
int k = 0;
while(k<50){
/*
*At this point the predicate is either k%2==0 or k%3!=1,
* depending on which lambda you assigned earlier.
*/
if(intPredicate.test(k)){
// Code logic goes here
k++;
}
}
}
}
PS:请注意我使用随机布尔值在谓词之间切换,但您可以使用任何条件
我看不出有什么方法可以巧妙地简化三元表达式的逻辑。但是,如果您将逻辑检查放在 while
循环之外 k
,那么您只需进行一次检查:
int k = 0;
if (foo > 1) {
while (k < 50) {
if (k % 3 != 1) {
// code logic goes here
}
k++;
}
}
else {
while (k < 50) {
if (k % 2 == 0) {
// code logic goes here
}
k++;
}
}
这不是漂亮的代码,但它使您不必在循环的每次迭代中都使用三元表达式。
Java 8 允许多种变体:
IntConsumer businessLogic = (k) -> { ... };
或者做一个方法用::businessLogic
.
if (foo) {
IntStream.range(0, 50)
.filter(k % 3 != 1)
.forEach(businessLogic);
} else {
IntStream.range(0, 50)
.filter(k % 2 == 0)
.forEach(businessLogic);
}
纯属口味问题,不过我喜欢把硬数值常量放在一起看。
当然可以这样写:
无条件循环测试:
IntStream is = IntStream.range(0, 50);
is = ... ? is.filter(k % 3 != 1) : is.filter(k % 2 == 0);
is.forEach(businessLogic); // Only now one iterates.
完整代码: http://pastebin.com/UghV3xdT
我有 2 个几乎完全相同的方法,它们只有一个 if 语句不同:if (k % 3 != 1)
和 if(k % 2 == 0)
。
int k = 0;
while(k<50){
if(k % 3 != 1){ // OR if(k % 2 == 0)
// Code logic goes here
k++;
}
}
每个case的使用由Array的长度决定,这意味着特定的case只需要确定1次。 'k'表示另一个数组的索引,50是这个数组的长度。
我可以写类似 if(foo > 1 ? k % 3 != 1 : k % 2 == 0)
的东西,但这需要程序在每次循环运行时执行操作。
在某种程度上,我想要一种更新布尔值。有什么办法可以做到这一点,或者这是按价值传递的缺点吗?我应该保留两个单独的方法还是使用三元运算符更好?
本质上,我正在寻找一种包含表达式而不是值的类型。
您可以创建两个具有相同功能的不同 类,然后使用其中一个。比如循环外:
class A{ bool calc(int n){return n%3 != 1} }
class B{ bool calc(int n){return n%2 == 0} }
Object x = (foo > 1 ? new A():new B());
那么你只能在循环中使用x.calc(k)
。
在Java 8 中有一个很好的功能接口IntPredicate
。如果将它与 lambda 表达式结合使用,您可以在没有重复、额外代码或任何减速的情况下实现您的目标:
public final class Example {
public static void main(String[] args) {
//Instead of randomly choosing the predicate, use your condition here
Random random = new Random();
IntPredicate intPredicate = random.nextBoolean() ? i -> i % 2 == 0 : i -> i % 3 != 1;
int k = 0;
while(k<50){
/*
*At this point the predicate is either k%2==0 or k%3!=1,
* depending on which lambda you assigned earlier.
*/
if(intPredicate.test(k)){
// Code logic goes here
k++;
}
}
}
}
PS:请注意我使用随机布尔值在谓词之间切换,但您可以使用任何条件
我看不出有什么方法可以巧妙地简化三元表达式的逻辑。但是,如果您将逻辑检查放在 while
循环之外 k
,那么您只需进行一次检查:
int k = 0;
if (foo > 1) {
while (k < 50) {
if (k % 3 != 1) {
// code logic goes here
}
k++;
}
}
else {
while (k < 50) {
if (k % 2 == 0) {
// code logic goes here
}
k++;
}
}
这不是漂亮的代码,但它使您不必在循环的每次迭代中都使用三元表达式。
Java 8 允许多种变体:
IntConsumer businessLogic = (k) -> { ... };
或者做一个方法用::businessLogic
.
if (foo) {
IntStream.range(0, 50)
.filter(k % 3 != 1)
.forEach(businessLogic);
} else {
IntStream.range(0, 50)
.filter(k % 2 == 0)
.forEach(businessLogic);
}
纯属口味问题,不过我喜欢把硬数值常量放在一起看。 当然可以这样写:
无条件循环测试:
IntStream is = IntStream.range(0, 50);
is = ... ? is.filter(k % 3 != 1) : is.filter(k % 2 == 0);
is.forEach(businessLogic); // Only now one iterates.