【问题标题】:Converted if statement to ternary operator - compiler complains that it is not a statement将 if 语句转换为三元运算符 - 编译器抱怨它不是语句
【发布时间】:2020-06-12 02:33:41
【问题描述】:
package com.myname.zed;

import org.junit.Test;
import java.util.concurrent.atomic.AtomicInteger;


public class MyTest
{

    AtomicInteger counter = new AtomicInteger(100);

    @Test
    public void testAtomic()
    {
        for (int i = 1; i < 610; i++) {
            if (counter.compareAndExchange(100, 0) == 100) {
                System.out.println("trace");
            }
            else {
                counter.getAndIncrement();
            }
        }
    }

/* converted if to ternary, it is not compiling now */

    @Test
    public void testAtomic1()
    {
        for (int i = 1; i < 610; i++) {
            counter.compareAndExchange(100, 0) == 100 ? System.out.println("trace") : counter.getAndIncrement();
        }

    }

}

我需要在 100 次中仅打印一次日志行。 当我使用 if 语句编写时,它按预期工作。 我将“if”转换为三进制,编译器抱怨它不是一个语句。

我在这里错过了一些非常简单的事情吗?还有没有其他有效的方法来编写这个逻辑。

我最终做了类似的事情,每 100 次记录一次跟踪记录(可能不是很准确,但这符合我的需要):

    final private ThreadLocalRandom random = ThreadLocalRandom.current();
@Test
public void testTLR()
{
    if (50 == random.nextInt(100)) {
        System.out.println("trace");
    }
    else {
        System.out.println("no trace: ");
    }
}

【问题讨论】:

  • if 做一个语句,三元运算符做一个表达式。 Java 不会让您在需要语句的地方使用表达式(也不会生成语句)。换句话说,...?...:... 在所有情况下都不能正确替换 if(...) ... else ...

标签: java if-statement compiler-errors conditional-operator


【解决方案1】:

错误信息是正确的;你需要一个声明,三元表达式不是一个。 java中的大多数东西要么是语句,要么是表达式;选择的一些事情是:方法调用(包括“奇怪”的调用,如构造函数调用)、赋值(a = 5 以及 a += 5)和一元运算符,如 a++)。

我不确定你所说的“高效”是什么意思。与三元运算符一样,if 语句速度快、性能好。

如果你的意思是更短,你不需要大括号:

if (counter.compareAndExchange(100, 0) == 100) System.out.println("trace"); else counter.getAndIncrement(); - 都适合一行,但是否适合您的风格偏好是您的决定。

在 java 中没有“允许我将任何和所有表达式视为语句”选项的魔法。

【讨论】:

  • “效率”,我的意思是不使用AtomicInteger和CAS方法是否可以实现相同的逻辑。
  • @VijayakumarChava 好吧,你想完成什么?
  • 试图做这样的事情:
    catch(Exception e){ if(count==100){ //每 100 次,以线程安全的方式 logger.error(e); } else{ 记录器(e.getMessage()); } }
  • 最终,我这样做是为了每百次记录一次跟踪:`final private ThreadLocalRandom random = ThreadLocalRandom.current(); @Test public void testTLR() { if (50 == random.nextInt(100)) { System.out.println("trace"); } else { System.out.println("没有痕迹:"); } }
猜你喜欢
  • 2021-07-09
  • 1970-01-01
  • 2012-02-12
  • 1970-01-01
  • 2013-05-17
  • 2018-10-25
  • 1970-01-01
  • 1970-01-01
  • 2018-12-26
相关资源
最近更新 更多