Java 自动更新布尔值
背景: 完整代码: 我有两个几乎完全相同的方法,它们只能因一个if语句而不同:Java 自动更新布尔值,java,boolean,pass-by-reference,pass-by-value,Java,Boolean,Pass By Reference,Pass By Value,背景: 完整代码: 我有两个几乎完全相同的方法,它们只能因一个if语句而不同:if(k%3!=1)和if(k%2==0) intk=0; 虽然(K1?k%3!=1:k%2==0)但这需要程序在每次循环运行时执行操作 在某种程度上,我想要一种更新布尔值。有没有办法做到这一点,或者这是价值传递的缺点?我应该保留两种不同的方法,还是使用三元运算符更好 本质上,我在寻找一个包含表达式而不是值的类型。您可以创建两个具有相同函数的不同类,然后使用其中一个。例如,循环外: class A{ bool ca
if(k%3!=1)
和if(k%2==0)
intk=0;
虽然(K1?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)
在Java8中有一个很好的函数接口,名为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++;
}
}
}
}
公共最终类示例{
公共静态void main(字符串[]args){
//不要随机选择谓词,而是在此处使用您的条件
随机=新随机();
IntPredicate IntPredicate=random.nextBoolean()?i->i%2==0:i->i%3!=1;
int k=0;
while(k我看不到任何方法可以巧妙地简化三元表达式的逻辑。但是,如果您将逻辑检查置于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++;
}
}
intk=0;
如果(foo>1){
而(k<50){
如果(k%3!=1){
//代码逻辑在这里
}
k++;
}
}
否则{
而(k<50){
如果(k%2==0){
//代码逻辑在这里
}
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.
这与他使用三元运算符的原始解决方案没有区别这与原始解决方案不同;请注意“超出循环”。这只是IntPredicate
的前lambda格式副本。他仍然可以进行一次检查,并且仍然有一个循环:)假设OP可以并且想要使用Java 8,这个答案很好。它适用于Java<8,那么你只需要写下接口并使用一个匿名类而不是lambdaOf,当然,假设Java 8非常合理。Java 7已经过时,Java 9很快就会出现。这就是我要找的!谢谢@TomMartens嗨,如果你认为这是解决你问题的正确方法,请接受答案。
IntStream is = IntStream.range(0, 50);
is = ... ? is.filter(k % 3 != 1) : is.filter(k % 2 == 0);
is.forEach(businessLogic); // Only now one iterates.