Преобразованный оператор if в троичный оператор - компилятор жалуется, что это не оператор - PullRequest
0 голосов
/ 28 февраля 2020
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. Я преобразовал «если» в троичный, компилятор жалуется, что это не утверждение.

Я что, упускаю что-то очень простое? И есть ли какой-нибудь другой эффективный способ написания этой логики c.

И я закончил тем, что делал подобное для записи трассировки один раз в 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: ");
    }
}

1 Ответ

2 голосов
/ 28 февраля 2020

Сообщение об ошибке находится на точке; вам нужно утверждение там, а троичное выражение не одно. Большинство вещей в java являются либо утверждением, либо выражением; Некоторые из них могут быть выбраны: вызовы методов (включая «странные», такие как вызовы конструктора), присваивания (a = 5, а также a += 5) и унарные операторы, такие как a++).

Я не уверен, что вы подразумеваете под «эффективными». Оператор if такой же быстрый, с точки зрения производительности, как и троичный оператор.

Если вы имеете в виду короче, вам не нужны скобки:

if (counter.compareAndExchange(100, 0) == 100) System.out.println("trace"); else counter.getAndIncrement(); - что подходит всем одна строка, но решение о том, соответствует ли это вашим стилевым предпочтениям,

Нет волхвов c, позволяющих мне рассматривать любые выражения в качестве операторов в java.

...