Насколько я понимаю, это один оператор в Java:
while((x % p == 0l) && (x > p)) x /= p;
Если это так, то почему это синтаксическая ошибка:
final AtomicLong subtotal = new AtomicLong(limit);
final long maxPrimeFactor = primeStream.takeWhile(p -> p * p <= limit)
.filter(p -> subtotal.get() % p == 0)
.peek(p -> while((subtotal.get() % p == 0) && (subtotal.get() > p)) subtotal.set(subtotal.get() / p)) // Syntax error here.
.dropWhile(p -> p != subtotal.get())
.findFirst()
.getAsLong();
И это не синтаксическая ошибка.
final AtomicLong subtotal = new AtomicLong(limit);
final long maxPrimeFactor = primeStream.takeWhile(p -> p * p <= limit)
.filter(p -> subtotal.get() % p == 0)
.peek(p -> { while((subtotal.get() % p == 0) && (subtotal.get() > p)) subtotal.set(subtotal.get() / p)); } // No syntax error here.
.dropWhile(p -> p != subtotal.get())
.findFirst()
.getAsLong();
Примечание. Ответы на отмеченный дубликат не дали мне ответа на вопрос. Принятый ответ сделал.
Цикл while
с телом — это не один оператор.
@ElliottFrisch технически это одно утверждение. Некоторые операторы могут содержать внутри другие операторы.
В частности Оператор while
@talex Возможно. Он дает разбивку как WhileStatement: while ( Expression ) Statement
, что означает, что это два оператора в одном, как вы сказали, но Expression
может завершиться, и в этом случае подоператор не выполняется. Таким образом, если они представляют собой одно утверждение, оно не является атомарным.
Он называется WhileStatement. Что еще тебе нужно? Какое определение высказывания вы используете?
p->something
ожидайте, что something
будет выражением, а не утверждением.
p->{something}
ожидайте, что something
будет утверждением или, точнее, списком утверждений.
См.: 15.27. Лямбда-выражения
Конкретно 15.27.2. Лямбда-тело:
LambdaBody:
Expression
Block
Block:
{ [BlockStatements] }
это один оператор в Java
Да. Ключевое слово, утверждение. Если вы используете лямбда-синтаксис без скобок, то справа от стрелки должно быть выражение. Это while
утверждение не является таковым, поэтому оно незаконно. См. JLS §15.27.
Вас может смутить это несколько странное понятие в Java, называемое «операторы выражения».
Некоторые вещи в Java являются одновременно оператором и выражением (или, скорее, это выражения, которые можно превратить в оператор, просто добавив точку с запятой). Список довольно небольшой. Самые очевидные из них:
x++
например. Или x = 5
(это выражение! int x = 10; int y = x = 15;
является допустимым Java, и в результате x и y равны '15'. Результатом выражения присваивания является значение присвоенного объекта).Методы, возвращающие void
, представляют собой особенно странный вид выражений. Хотя это выражения, использование их каким-либо иным образом, кроме как в качестве оператора, является ошибкой компилятора из-за его части void
.
Дело в том, что все операторы выражений, даже методы, возвращающие void, по-прежнему считаются выражениями и, следовательно, могут образовывать бизнес-конец лямбда-выражения без фигурных скобок.
while
не является выражением; это просто заявление. Поэтому он не может появиться справа от этой стрелки (по крайней мере, без фигурных скобок).
Если хотите настоящих странностей, загляните switch
. Это не совсем операторное выражение, но его можно использовать как выражение или как оператор (по крайней мере, в последних версиях Java).
«Некоторые вещи в Java являются одновременно утверждением и выражением», что неверно. foo()
— выражение, foo();
— утверждение.
Не существует такого понятия, как «выражение утверждения». Вы, вероятно, имеете в виду «выражение-выражение».
Выражение переключателя и оператор переключения имеют разный синтаксис,
@talex Хотите уточнить? Я хотел бы увидеть пример каждого.
@TrippKinetics возможно, что в выражениях используется case FOO ->
вместо case FOO:
, но сам оракул также называет обозначение стрелки «операторами переключения», и вы можете использовать их в переключателях операторов. Такое ощущение, что компания Talex взяла на себя педантическую миссию, и они перегнули палку.
@rzwitserloot достаточно справедливо. Я предполагаю, что выражение переключения можно использовать в качестве оператора, потому что это оператор-выражение, но если оракул видит это по-другому, то я ошибаюсь. И да, вы правильно угадали мою миссию :)
Покажите нам полный текст ошибки.