У меня есть приведенный ниже код, который немного уродлив для множественных нулевых проверок.
String s = null;
if (str1 != null) {
s = str1;
} else if (str2 != null) {
s = str2;
} else if (str3 != null) {
s = str3;
} else {
s = str4;
}
Поэтому я попытался использовать, Optional.ofNullable
как показано ниже, но все еще трудно понять, читает ли кто-то мой код. как лучше всего это сделать в Java 8.
String s = Optional.ofNullable(str1)
.orElse(Optional.ofNullable(str2)
.orElse(Optional.ofNullable(str3)
.orElse(str4)));
В Java 9 мы можем использовать Optional.ofNullable
с OR
, но в Java8 есть ли другой подход?
or
Синтаксис Java9String s = Optional.ofNullable(str1) .or(() -> Optional.ofNullable(str2)) .or(() -> Optional.ofNullable(str3)) .orElse(str4);
выглядит не так хорошо, какStream.of
я бы сказал.StringUtils.firstNonBlank()
Ответы:
Сделать это можно так:
источник
{str1, str2, str3}
) выглядят намного медленнее, чем локальныеif
или?:
, которые среда выполнения Java может оптимизировать. Есть ли какая-то оптимизация для Streamjavac
и среда выполнения Java, которая делает это так же быстро, как?:
? В противном случае я не буду рекомендовать это решение в критически важном для производительности коде.?:
код, и я уверен, что вам следует избегать этого в критичном к производительности коде. Однако он намного более читабелен, и вам следует рекомендовать его в коде IMO, не критичном к производительности, который, я уверен, составляет более 99% кода.javac
во время выполнения, ни во время его выполнения. Это не препятствует общей оптимизации, такой как встраивание всего кода с последующим устранением избыточных операций. В принципе, конечный результат может быть таким же эффективным, как и простые условные выражения, однако маловероятно, что он когда-либо будет достигнут, так как среда выполнения потратит необходимые усилия только на самые горячие пути кода.str4
к параметрамStream.of(...)
и использоватьorElse(null)
в конце.Как насчет тернарного условного оператора?
источник
// take first non-null of str1..3
. Как только вы знаете, что он делает, становится легко увидеть, как это сделать.?:
лестницу, вы поймете, что она делает. (Между прочим, функциональные программисты знают это как(cond ...)
предложения: это всегда охранник, за которым следует соответствующее значение, которое следует использовать, когда оно истинно.)Вы также можете использовать цикл:
источник
Текущие ответы хороши, но вы действительно должны поместить это в служебный метод:
Этот метод был в моем
Util
классе много лет, он делает код намного чище:Вы даже можете сделать его общим:
источник
Arrays.stream()
когда я могу сделать то же самое с afor
и a!= null
, что более эффективно. И Тодд был бы прав. Однако, когда я кодировал этот метод, я искал способ сделать это с использованием функций Java 8, как и OP, так что вот оно.Я использую вспомогательную функцию, что-то вроде
Тогда такой код можно записать как
источник
v0
параметр?min
в качестве примера.) Я менее уверен, что здесь это уместно.firstNonNull(arr)
вернуть arr, если он не равен нулю. Если бы это былоfirstNonNull(T... vs)
так, вместо этого он вернул бы первую ненулевую запись в arr.Решение, которое можно применить к любому количеству элементов, может быть:
Вы можете представить решение, подобное приведенному ниже, но первое обеспечивает
non nullity
для всех элементовисточник
str4
несмотря на то, что на самом деле этоorElseNull
, что равносильноstr4
нулю.Вы также можете объединить все строки в массив String, а затем выполнить цикл for для проверки и выхода из цикла после его назначения. Предполагая, что s1, s2, s3, s4 - все строки.
Отредактировано для включения условия по умолчанию для s4, если ничего не назначено.
источник
s4
(илиstr4
), которое должно быть присвоеноs
в конце, даже если оно равно нулю.Метод основан и прост.
И используйте его как:
Это просто делать с массивами и выглядит красиво.
источник
Если вы используете Apache Commons Lang 3, это можно записать так:
Использование
ObjectUtils.firstNonNull(T...)
взято из этого ответа . В смежном вопросе также были представлены различные подходы .источник