Есть ли полезные ярлыки, которые можно использовать в Java?
Как показано ниже, import
уже добавляет не менее 17 символов в программу.
import java.io.*;
Я понимаю, что простым решением было бы использование другого языка, но, похоже, реальная проблема заключается в сокращении программ на Java.
Подсказки должны быть специфичны для Java: если они применимы к большинству языков, подобных C, они относятся к более общему списку советов .
package
можно пропуститьОтветы:
Используйте самую последнюю возможную Java. Java 8 позволяет вам использовать лямбда-выражения, поэтому используйте его, если вам нужно что-то, даже как функциональные объекты.
Определите сокращенные функции для вещей, которые вы часто используете. Например, у вас есть сотня вызовов
exampleClassInstance.doSomething(someParameter)
, определите новую функциюvoid d(ParameterType p){exampleClassInstance.doSomething(p)}
и используйте ее, чтобы сохранить себе несколько символов.Если вы используете определенное длинное имя класса более одного раза, например
вместо этого определите новый класс:
Если вы используете только один конкретный метод этого класса (но вам все еще нужно создать его экземпляр), вы можете одновременно определить сокращенную версию внутри нового класса.
Используйте параметры типа функции для сокращения, где это возможно, таких как:
Используйте
for(;;)
вместоwhile(true)
.Не используйте модификаторы доступа без крайней необходимости.
Не используйте
final
ни для чего.Никогда не ставьте блок после
for
цикла (но цикл foreachfor(x:y)
отличается). Дополнительные заявления должны быть помещены в самомfor
утверждении, какfor(int i=0;i<m;a(i),b(++i))c(i);
.Используйте встроенное присваивание, приращение, создание экземпляров. При необходимости используйте анонимные встроенные классы. Вместо этого используйте лямбды, если это возможно. Вызов функции гнезда. Некоторые функции гарантированно возвращают свой родительский объект, эти фактически даже предназначены для объединения в цепочку.
Твой
main
метод твоиthrows Exception
, а не ловит их.Error
короче чемException
. Если по какой-то причине вам действительно нужноthrow
отправить сообщения в стек, используйтеError
, даже если это совершенно нормальная ситуация.Если какое-либо условие потребует немедленного прекращения, используйте
int a=1/0;
вместоthrow null;
илиSystem.exit(0);
. Во время выполнения это бросаетArithmeticException
. Если в вашем коде уже есть числовая переменная, используйте ее. (Если у вас уже естьimport static java.lang.System.*;
, идти сexit(0);
.)Вместо реализации интерфейсов, таких как
List<E>
, расширяйте непосредственный (или не очень немедленный, если есть какое-либо преимущество в этом вообще) дочерний класс, напримерAbstractList<E>
, который обеспечивает реализации большинства методов по умолчанию и требует только реализации несколько ключевых частей.Сначала напишите свой код от руки, с символами новой строки, отступами и полными именами переменных. Если у вас есть рабочий код, вы можете сокращать имена, перемещать объявления и добавлять ярлыки. Написав это долго, вы даете себе больше возможностей упростить программу в целом.
Сравните альтернативные варианты оптимизации с фрагментом кода, поскольку наиболее оптимальная стратегия может кардинально измениться при очень небольших изменениях кода. Например:
Arrays.sort(a)
, самый эффективный способ - это позвонить с полностью определенным именемjava.util.Arrays.sort(a)
.void s(int[]a){java.util.Arrays.sort(a);}
. В этом случае все равно следует использовать полное имя. (Если вам нужно более одной перегрузки, вы, вероятно, делаете это неправильно.)for
цикла в гольфе, в отсутствие легкодоступного библиотечного метода), вы можете воспользоватьсяArrays.copyOf
этой задачей. Когда используется более одного метода и имеется 3 или более вызовов, выполнениеimport static java.util.Arrays.*;
является наиболее эффективным способом обращения к этим методам. После этого, только если у вас есть более 8 отдельных вызовов,sort
вы должны использовать для него ярлык, и только для 5 или более звонков это оправданоcopyOf
.Единственный реальный способ выполнить такой анализ кода - это выполнить потенциальные модификации копий кода, а затем сравнить результаты.
Избегайте использования
someTypeValue.toString();
метода, просто добавьтеsomeTypeValue+""
.Если вам нужны окна, не используйте Swing, используйте AWT (если вам действительно не нужно что-то из Swing). Сравните
import javax.swing.*;
иimport java.awt.*;
. Кроме того, компоненты в Swing имеютJ
префикс перед своим именем (JFrame
,JLabel
и т. Д.), А компоненты в AWT - нет (Frame
,Label
и т. Д.)источник
Используйте
interface
вместоclass
.В Java 8 статические методы были добавлены к интерфейсам. В интерфейсах все методы общедоступны по умолчанию. вследствие этого
Теперь можно сократить до
что, очевидно, короче.
Например, я использовал эту функцию в Hello, World! вызов.
источник
С помощью varargs вы можете «привести» параметр к массиву того же типа:
вместо
источник
При статическом импорте :
Вы можете сохранить некоторые шаблоны позже, но вам нужно несколько вызовов для достижения результата:
источник
Java
!import static java.lang.System.*
.var o=System.out;
что нужно только дважды использовать, прежде чем оно окупитсяvar o=System.out.println
работать?main
Не нужно вызывать аргумент toargs
, и вы можете сократить пробелы:все будет хорошо.
источник
Если вам когда-либо придется использовать логические выражения
true
илиfalse
, замените их на1>0
и1<0
соответственно.Например:
Этот пример линейного поиска может быть уменьшен до
источник
true/false
, просто добавьтеboolean t=1>0,f=1<0;
. Тогда вместо того1>0
, чтобы использоватьt
и сохранить два символа за использование. Выплата по1>0
методу прибывает в 10 использований.boolean t=1>0,f=!t;
- один символ короче!true
/false
напрямую в любом случае:f|=a[i++]==42;
экономит довольно много.boolean
, но так как я не мог придумать никаких примеров во время написания (я обычно не пишу код на Java), я просто написал простой пример.Если вы собираетесь часто использовать какой-либо метод, присвойте его резидентный класс переменной. Например, присвойте
System.out
переменную:Также для
Integer.parseInt()
:Это почти наверняка вызовет предупреждение ide о «доступе к статическому методу из переменной».
источник
((Integer)1).parseInt("1")
тоже работаетnew Integer("1")
еще короче. Но Джастин имел в виду, что его ответом является то, что вы можете повторно использовать переменные, которые у вас уже есть для статических вызовов. Как я объясню внизу этого ответа.Вместо того чтобы использовать
import static java.lang.System.*
технику для экономии наprintln()
операторах, я обнаружил, что определение следующего метода гораздо более эффективно для сохранения символов:Это потому, что это может быть вызвано тем
p(myString)
,out.println(myString)
что имеет гораздо более быстрый и драматический характер.источник
Это может показаться очевидным, но для некоторых
Math
функций есть более короткие варианты :источник
Если вам нужно
Integer.MAX_VALUE
(2147483647), используйте-1>>>1
.Integer.MIN_VALUE
(-2147483648) лучше написано1<<31
.источник
Если вам нужно получить число из аргумента (или любой другой строки), обычно вы видите что-то вроде:
Много раз, вам не нужно
Integer
. Много проблем не используют большие числа. ПосколькуShort
иByte
оба будут распакованыint
, используйте более подходящееvalueOf()
и сохраните пару байтов.Сохраните фактическую переменную как
int
, хотя, так как она короче, чем обаbyte
иshort
:Если вам нужно сделать это для нескольких номеров, вы можете комбинировать этот метод :
источник
int n=new Byte(a[0]);
в три раза короче Если число может быть больше, используйтеlong n=new Long(a[0])
,int
в большинстве случаев оно все же лучше, чем s.Не используйте
public class
. Основной метод должен быть публичным, а его класс - нет. Этот код работает:Вы можете бежать,
java S
даже еслиclass S
это не публичный класс. ( Обновление: я использовал Java 7, когда писал этот совет. В Java 8 ваш основной метод должен быть в интерфейсе . В Java 5 или 6 ваш основной метод должен быть в перечислении .)Многие программисты на Java этого не знают! Около половины ответов на вопрос Stack Overflow о main в непубличном классе ошибочно утверждают, что метод main должен быть в публичном классе. Теперь ты знаешь лучше. Удалить
public
вpublic class
и сохранить 7 символов.источник
interface s{static void main(String[]...
будет короче. Если вы должны иметь скомпилированный исходный файл и метод main. Поскольку в интерфейсе Java 1.8 все методы являются общедоступными, вы можете пропустить модификатор метода (ов).Несколько небольших советов по игре в гольф
Эти советы были слишком малы для отдельных ответов, поэтому я буду использовать этот ответ для очень маленьких советов по поиску кода, которые я нашел или придумал, и пока не упоминается в других советах:
Удаление последнего символа строки:
В некоторых случаях вы заранее знаете, какой последний символ, и также знаете, что этот символ встречается в строке только один раз. В этом случае вы можете использовать
.split
вместо:Сочетания клавиш:
Все кодировки имеют каноническое имя, используемое в
java.nio
API, а также каноническое имя , используемое вjava.io
иjava.lang
API. Вот полный список всех поддерживаемых кодировок в Java. Поэтому всегда используйте самый короткий из двух; вторая обычно короче (какUTF-8
противutf8
,Windows-1252
противCp1252
и т. д.), но не всегда (UTF-16BE
противUnicodeBigUnmarked
).Случайный логический:
Штрихи:
Есть много разных способов проверить простые числа или получить все простые, но ответ @ SaraJ здесь самый короткий. Вот копия-вставка в качестве ссылки:
ПРИМЕЧАНИЕ. Обычно вы можете объединить его с другими существующими циклами в зависимости от того, как вы хотите его использовать, поэтому вам не понадобится отдельный метод. Это сэкономило много байтов в этом ответе, например.
Целочисленное усечение вместо Math.floor / Math.ceil:
Если вы используете положительный double / float и хотите
floor
их использовать, не используйте,Math.floor
а(int)
вместо этого используйте -cast (поскольку Java усекает целые числа):Тот же трюк может быть применен к отрицательным двойным / плавающим числам, которые вы хотите
ceil
вместо этого:Используйте
&1
вместо того,%2
чтобы избавиться от скобок:Поскольку оператор Внеочередной из
&
ниже арифметических операторов по умолчанию , как*/+-
и%
вы можете избавиться от скобок в некоторых случаях.Обратите внимание, что это не очень помогает в булевых проверках, потому что тогда вам все еще понадобятся скобки, они просто немного сдвинуты:
BigIntegers и создание переменных для вызовов статических методов:
При использовании BigIntegers, создайте его только один раз, который затем сможете использовать повторно. Как вы знаете, BigInteger содержит статические поля для
ZERO
,ONE
иTEN
. Поэтому, когда вы используете только эти три, вам не нужно,import
но можете использоватьjava.Math.BigInteger
напрямую.ПРИМЕЧАНИЕ: вы должны использовать
=null
такt
инициализировано для использованияt.
.Иногда вы можете добавить несколько BigIntegers, чтобы создать другой для сохранения байтов. Допустим, вы хотите иметь BigIntegers
1,10,12
по какой-то причине:Как правильно указано в комментариях, трюк с
BigInteger t=null;
вызовами статических методов также можно использовать с другими классами.Например, этот ответ с 2011 года может быть гольфом:
getBytes()
вместоtoCharArray()
Когда вы хотите зациклить символы строки, вы обычно делаете это:
Циклы по символам могут быть полезны при их печати, или добавлении их в строку, или что-то подобное.
Однако, если вы используете только символы для некоторых расчетов юникода-номер, вы можете заменить
char
сint
, и вы можете заменитьtoCharArray()
сgetBytes()
:Или даже короче в Java 8+:
В Java 10+ зацикливание на символе для печати теперь также может выполняться в 22 байта:
Случайный предмет из
List
:Проверьте, содержит ли строка начальные / конечные пробелы
Почему это работает, когда
!=
в Strings нужно проверять ссылку, а не значение в Java? ПотомуString#trim
что вернет « Копию этой строки с удаленными начальным и конечным пробелами, или эту строку, если у нее нет начальных или конечных пробелов» . Я использовал это после того, как кто-то предложил мне это, в этом моем ответе .Палиндром:
Чтобы проверить, является ли String палиндромом (имея в виду как четные, так и нечетные длины строк), это самое короткое (
.contains
работает здесь, потому что мы знаем, что и сама строка, и ее обращенная форма имеют одинаковую длину):.contains(...)
а не.equals(...+"")
благодаря комментарию @assylias здесь .Либо 0, либо оба 0?
Я думаю, что большинство уже знают это: если вы хотите проверить, равен
a
илиb
равен нулю, умножьте вместо этого, чтобы сохранить байты:И если вы хотите проверить , равны ли оба
a
иb
равны нулю, вы можете использовать побитовое ИЛИ или сложить их вместе, если они всегда положительны:Четный = 1, нечетный = -1; или наоборот
Поэтому я добавить это после того, как видит
k+(k%2<1?1:-1)
в этом ответе :петля
n
Время в полной программеЕсли у нас есть проблема, когда полная программа обязательна, и нам нужно выполнить определенное количество циклов, мы можем сделать следующее:
То же самое относится, когда мы должны принять этот диапазон в качестве входных данных:
Кредит @JackAmmo в этом комментарии .
try-finally вместо try-catch (исключение e) при возврате и когда его использовать
Если вы не можете использовать a,
throws Exception
но должныcatch
и что-то сделать с ним до возвращения, вы можете использоватьfinally
вместо этого:Что касается примера того, когда использовать a
try-catch
, я могу сослаться на этот мой ответ (кредит на косвенный гольф идет в @KamilDrakari ). В этой задаче мы должны по диагонали зациклить матрицу NxM, поэтому мы должны определить, является ли количество столбцов или количество строк наименьшим, как наш максимум в цикле for (что довольно дорого с точки зрения байтов:)i<Math.min(a.length,a[0].length)
. Таким образом, простое отслеживаниеArrayIndexOutOfBoundsException
использованияcatch-finally
короче, чем эта проверка, и, таким образом, сохраняет байты:ПРИМЕЧАНИЕ. Это сработало только из-
return r;
за окончательного варианта. Мне предложили изменить первую ячейку, как @KamilDrakari в своем ответе на C #, чтобы сохранить байты. Однако в Java это означает, что мне придется изменить его наm->{try{for(int i=1;;m[0][0]=f(m[0][0],m[i][i++]));}catch(Exception e){}}
(73 байта), фактически увеличивая количество байтов вместо уменьшения, если бы я мог использоватьfinally
.Math.pow (2, п)
Когда вы хотите степень 2, побитовый подход намного короче:
Объединение битовых и логических проверок вместо использования скобок
Я думаю, что к настоящему времени известно, что
&
и|
может использоваться вместо&&
и||
в логических проверках Java (логических). В некоторых случаях вы все равно хотите использовать&&
вместо того,&
чтобы предотвратить ошибки, как, напримерindex >= 0 && array[index].doSomething
. Если значение&&
будет изменено на&
здесь, он все равно будет оценивать ту часть, где он использует индекс в массиве, вызываяArrayIndexOutOfBoundsException
, следовательно, использование&&
в этом случае вместо&
.Пока что основы
&&
/||
vs&
/|
в Java.Когда вы хотите проверить
(A or B) and C
, может показаться, что самые короткие используют побитовые операторы:Однако, поскольку побитовые операторы имеют приоритет операторов над логическими проверками, вы можете объединить оба, чтобы сохранить байт здесь:
Используйте
n+=...-n
вместо(long)...
Если у вас есть длинная длина и в лямбда-выходе, например, при использовании
Math.pow
, вы можете сохранить байт, используяn+=...-n
вместо(long)...
.Например:
Это спасло байты в этом ответе шахты , и даже два байта, комбинируя
-n-1
в+~n
в этом ответе шахты .источник
positive integers
? Кроме того , я не уверен , что если реализация CEIL работает .since Java automatically floors on integers
; Я думаю, что правильный термин - усечение , а не настил .String t="";for(int i=s.length();--i>=0;t+=s.charAt(i));return s.equals(t);
s.equals(new StringBuffer(s).reverse()+"")
достаточно.Для игры в гольф, которая не требует ввода, вы можете использовать статические блоки и запускать их без каких-либо основных методов, просто скомпилируйте их с помощью Java 6.
источник
java
в командной строке / в файле манифеста, какой класс загружать.Мы все знаем о побитовом xor (
^
), но это также логический xor.Так
(a||b)&&!(a&&b)
просто становитсяa^b
.Теперь мы можем использовать xor.
Кроме того , операторы,
|
а&
также работают , просто помните, что приоритет оператора меняется.источник
&
и|
также. Это может быть полезно, если ваши условия уже указаны в скобках или если вы уже работаете с логическими значениями.!=
вместо^
xor и==
xnorВам не нужно использовать
Character.toLowerCase(char c)
. Вместо этого используйте(c|32)
. ВместоCharacter.toUpperCase(char c)
использования(c&~32)
. Это работает только с буквами ASCII.источник
c|~32
будет иметь тенденцию приводить к -1 ... лучше использоватьc-32
.Преобразовать строку в число
Есть несколько способов преобразовать строку в числовое значение:
ABC.parseABC :
ABC.valueOf :
ABC.decode :
новая азбука :
Таким образом, для игры в код лучше использовать конструктор при преобразовании строки в числовое значение.
То же самое относится и к
Double
;Float
; иByte
.Это не всегда применимо, когда вы можете повторно использовать уже существующий примитив в качестве объекта.
В качестве примера, скажем, у нас есть следующий код:
Вы можете использовать
.decode
вместо более короткого конструктора, повторно используя параметр в качестве объекта:источник
Не использовать
Random
!В общем, если вам нужны случайные числа,
Random
это ужасный способ сделать это *. Намного лучше использоватьMath.random()
вместо этого. Чтобы использоватьRandom
, вам нужно сделать это (скажем, нам нуженint
):Сравните это с:
а также:
Первый метод принимает
41+15n
символы (n
это количество вызовов). Второе это25n
символы, а третье43+7n
.Так что, если вам это нужно только один или два раза, используйте встроенный
Math.random()
метод. Для трех или более звонков вы сэкономите, используя функцию. Либо один сохраняет символы при первом использовании болееRandom
.Если вы уже используете
Math.random()
дляdouble
, помните, что в четырех случаях, это все еще экономия, чтобы вытащить его в:Для 33 символов вы будете экономить 10 на каждом вызове
r()
Обновить
Если вам нужно целое число и вы хотите сэкономить на разыгрывании, не разыгрывайте его! Java автоматически преобразуется, если вы выполняете операцию вместо присваивания. Для сравнения:
* Если вам не нужно сеять PRNG для предсказуемых результатов. Тогда я не вижу большого пути обойти это.
источник
Random#nextGaussian
хотя.(int)(Math.random()*9)
имеет очень небольшое смещение по модулю, потому чтоMath.random()
возвращает 2 53 возможных значений, а 2 53 не кратно 9. Вероятность каждого числа находится в пределах 1/9 плюс или минус 5 / (9 * 2 ** 53), ошибка настолько мала, что почти точно равна 1/9.9
в качестве примера, это может быть что угодно. Я относительно уверен, чтоnextInt()
(или любой другойRandom
метод) также имеет небольшой уклон, просто из-за того, как работает PRNG в Java.new java.util.Random().nextBoolean()
вы можете использоватьMath.random()<.5
.Я не знаю, считаете ли вы эту «чистую» Java, но обработка позволяет вам создавать программы с минимальной начальной настройкой (выполняется автоматически).
Для вывода на консоль у вас может быть что-то простое:
для графического вывода чуть больше:
источник
size
вообще; по умолчанию будет квадрат 100 на 100 пикселей. В большинстве ОС рамка вокруг нее будет примерно вдвое больше, с квадратом по центру, а остальная часть заполнена содержимым, взятым с рабочего стола.setup()
иdraw()
использовать «статический режим». Вы также можете использовать 6-значные шестнадцатеричные цвета, и интерпретатор изменит их, что иногда окупается (#FF8000
<255,128,0
), и если вы используете оттенки серого, необходимо указать только одно число (255
<255,255,255
)Сокращение возвращения
Вы можете сократить байты возврата строк байтом с помощью:
в
И, если вам случится начать выражение return с круглых скобок, вы можете сделать то же самое с ними:
в
Я предполагаю, что кавычки считаются круглыми скобками? Я на самом деле понял это через AppleScript, как ни странно, и подумал, что стоит упомянуть.
источник
return-n;
вместоreturn -n;
илиreturn~n;
вместоreturn ~n;
. А также сингл вместо двойных кавычек:return'A';
Не бойтесь использовать научную нотацию
Если вы имеете дело с удвоениями или числами с плавающей запятой, вы можете использовать научную запись чисел. Таким образом, вместо записи
double a=1000
вы можете изменить его,double a=1e3
чтобы сохранить 1 байт.источник
Попробуйте использовать
int
вместоboolean
В некоторых случаях я обнаружил, что короче возвращать целочисленное значение из метода, который обычно возвращает логическое значение, аналогично тому, что можно сделать в программах на Си.
Сразу же на
int
4 байта корочеboolean
. Каждый раз, когда вы пишетеreturn 0
вместоreturn 1<0
, вы сохраняете дополнительные 2 байта и то же самое дляreturn 1
болееreturn 1>0
.Подводный камень в том, что каждый раз, когда вы хотите использовать возвращаемое значение непосредственно как логическое значение, оно стоит 2 байта (
if(p(n))
v.if(p(n)>0)
). Это может быть восполнено путем использования логической арифметики. Учитывая придуманный сценарий, где вы хотите написатьвы можете вместо этого написать
чтобы сохранить 2 байта.
источник
0
и1
не являются ложными / верно в Java (и JLS не считает их таким образом либо). Так что, если гольф специально запрашивает правдивость / ложность, вам нужно логизировать его (и, к сожалению, сделать егоboolean
функцией, добавив в него еще больше байтов).t[0]+=p(n):10?0;
Это даже верно?t[0]+=p(n)?10:0;
. (Я редактировал это.)Если вы используете enum вместо class , вы сохраняете один символ.
Но вы должны ввести хотя бы один экземпляр enum (в этом примере F, G, H), который должен окупаться самостоятельно.
источник
enum M{;public static void main(String[]a){...}
без проблем.class M{
точно такой же длины, какenum M{;
. В этом случае я бы пошел с,class
потому что это красивее (IMO)enum{
работал без;
после; только IDE стонет, что есть ошибка, но компилятор принимает ееКогда у вас есть метод, который должен вернуть
boolean
илиBoolean
, то есть:Вы можете изменить тип
boolean
/Boolean
return дляObject
сохранения 1 байта:Кроме того, как вы могли заметить, вы можете использовать
<1
проверку вместо==0
сохранения байта. Хотя это скорее общий совет по коду, а не по Java.Это в основном используется, когда целое число не может быть отрицательным, например, проверка длины:
вместо
источник
c(-21)
возвращаетсяtrue
с текущим.c(-20)
вместо-21
?-21 % 5 = 4
и-20 % 5 = 0
.-21
.-21 % 5 != 4
в Java, что моя точка зрения. Функция, делимая на пять, будет работать правильно, если модуль всегда возвращает неотрицательное значение, но это не так. Смотрите этот пример фрагмента .%
, поэтому я забыл, что Java возвращает остаток вместо модуля, отсюда и разница ..Как рисовать на Java ...
Вот кратчайшая из возможных графических карт краски GUI:
Гольф для 111 байтов:
источник
Избегайте
StringBuilder
SДобавление материала к a
String
занимает гораздо меньше байтов.Если вам нужно перевернуть строку и сразу же напечатать ее, используйте
StringBuffer
.Если вам нужно перевернуть строку и затем сделать что-то еще, кроме ее печати, используйте
for
каждый цикл.источник
StringBuffer
для реверсивных строк.String b="";for(char c:"Hello, World!".toCharArray()){b=c+b;}
{}
из этого цикла foreach, если вы собираетесь использовать этот метод.String s:"".split("")
вместоchar c:"".toCharArray()
.java.util.stream.Stream
уже импортировали, и если вам нужно связать другой вызов с результатом (напримерB.chartAt(42)
), или если вам просто нужно передать результат в функцию (напримерf(B)
), то используйтеfor(:)
равно дляStream.of("Hello, World!".split("")).reduce("",(a,b)->b+a)
.String b=new StringBuffer("Hello, World!").reverse()+"";
(.toString
заменяется на+""
), а вторая строка может стать:String B="";for(String c:"Hello, World!".split(""))B=c+B;
(char
кString
и.toCharArray()
к.split("")
).Используйте Java 10
var
Если вы определяете одну переменную определенного типа, используйте
var
.Примеры
Не применимо ни в одном из следующих примеров
var
не может использоваться во многих примерахисточник
В большинстве случаев ваша программа будет однопоточной, то есть будет работать только один поток. Вы можете использовать этот факт,
return
используя метод main, когда вам нужно выйти немедленно.Сравните это с «правильным» завершением программы:
Или указывая на
null
:Или делим на 0:
источник
Иногда один оператор цикла for можно заменить. Рассмотрим следующий код:
Это простой цикл, который является решением этого вопроса .
Поскольку мы знаем, что
i
он не будет достаточно большим, чтобы вызвать ошибки StackOverflow, мы можем вместо этого заменить цикл for на рекурсию:Мы можем смоделировать цикл, используя троичный оператор в операторе return, чтобы вызвать рекурсию.
Это сокращение довольно специфично, но я могу представить больше ситуаций, когда это пригодится.
источник
С помощью
...
(varags) в качестве параметраВ некоторых случаях короче использовать Java varargs в качестве параметра вместо свободных.
Например:
Большинство будет играть в гольф на это:
Но можно прибавить к этому дополнительный байт:
Обратите внимание, что все три целых числа доступны только один раз в самом методе. Поскольку
int
он довольно короткий, полезно только, если вы используете их каждый раз только один раз внутри метода, и в качестве параметра у них есть три или более из них.С более длинными параметрами это обычно более полезно, хотя. Например, это был мой первоначальный ответ на этот вопрос (рассчитать вхождения входного символа во входную строку):
И мне порекомендовали сыграть в гольф именно так:
Но я закончил этим с помощью
...
:ПРИМЕЧАНИЕ. Если вопрос / задача требует гибкого ввода,
...
его,[]
конечно , можно сократить . Если вопрос / задача специально запрашивает, скажем, триString
ввода и запрещаетString
массив, содержащий три значения, вы можете использоватьString...
вместоString a,String b,String c
.источник
String[]
вместо varargs? (сохраняет еще 1 байт)