有一种方法get(sql)(我不能修改它).这个方法返回MyObjects,它必须在try catch块中,因为JqlParseException那里是可能的.我的代码是:
String sql = something;
try{
MyObject object = get(sql);
} catch(JqlParseException e){
e.printStackTrace();
} catch(RuntimeException e){
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
我想删除try catch并使用Optional类,我试过:
MyObject object = Optional.ofNullable(get(sql)).orElseThrow(RuntimeException::new);
Run Code Online (Sandbox Code Playgroud)
但是那里的IDE力量也尝试了.并为:
MyObject object = Optional.ofNullable(get(sql)).orElseThrow(JqlParseException::new));
Run Code Online (Sandbox Code Playgroud)
是一个错误(在IDE中)The type JqlParseException does not define JqlParseException() that is applicable.有没有办法避免尝试catch块并使用可选的?
我正在使用以下代码检查Map实例中是否存在密钥:
if (!map_instance.containsKey(key))
throw new RuntimeException("Specified key doesn't exist in map");
else
return map_instance.get(key);
Run Code Online (Sandbox Code Playgroud)
我的问题是:
是否有实用程序或Map实现来简化上述代码,例如:
custom_map.get(key,"Specified key doesn't exist in map");
Run Code Online (Sandbox Code Playgroud)
我的目标是:如果keymap中不存在,则map实现会使用传递的字符串抛出异常.
我不知道我的愿望是否合理?
(对不起,如果我使用错误的术语或语法,我仍在学习英语.)
Jetbrains最近决定java.util.Optional(以及Guava的com.google.common.base.Optional)不应该用作字段或参数类型...谢谢,但不,谢谢......这个警告怎么样被禁用?
作为旁注:触发针对Optional的这种特定用法的警告似乎完全没有道理......
有没有一个很好的理由没有:
OptionalInt.ofNullable(Integer);
Run Code Online (Sandbox Code Playgroud)
如果你想将一个可选/可空的Integer转换为OptionalInt,它似乎是一个完美的契合.我目前正在使用我写的这个util方法:
public static OptionalInt optionalIntOfNullable(Integer integer){
return integer == null ? OptionalInt.empty() : OptionalInt.of(integer);
}
Run Code Online (Sandbox Code Playgroud)
那不是那么糟糕,但是,我想知道我是否错过了什么.
您好,我有两个代码示例
if / else if / else语句
private Object getObj(message) {
if (message.getA() != null)
return message.getA();
else if (message.getB() != null)
return message.getB();
else if (message.getC() != null)
return message.getC();
else return null;
}
Run Code Online (Sandbox Code Playgroud)
可选陈述
private Optional<Object> wrap(Object o){
return Optional.ofNullable(o);
}
private Object getObj(message) {
return wrap(message.getA())
.orElseGet(() -> wrap(message.getB())
.orElseGet(() -> wrap(message.getC())
.orElse(null)));
}
Run Code Online (Sandbox Code Playgroud)
所以我的问题是,这两者在性能方面如何比较(我在实际代码中大约有15-20条if-else语句)?
值得重构代码的可读性和性能,还是滥用可选选项?
另外,如果if / else-if语句增长到100+,性能损失会是多少?
提前致谢
这是Java 8中Optional类型的有效(预期)用法吗?
String process(String s) {
return Optional.ofNullable(s).orElseGet(this::getDefault);
}
Run Code Online (Sandbox Code Playgroud) 在Stackoverflow上已经有很多关于在Java 中使用Optional的正确方法的讨论(像这样的讨论,或者这个)
截至目前,在Java中使用Optional作为类成员被广泛认为是一种代码气味,甚至因故意不实现Serializable接口而气馁.此外,我们应该在DTO,构造函数和方法的输入参数中避免它.从视图中的一切OOP点我迄今大约读可选吸引我的原因.
我的问题是,Scala的FP方面是否会以某种方式改变某些东西我们应该使用Optional?特别是因为Scala 中Optional的实现似乎更丰富.我发现很多文章描述了如何在Scala中使用它,但是没有一篇文章在我应该使用它时何时耗尽主题,何时不应该使用它.
我已经阅读了很多有关Optional应该使用的案例的信息。
我读过的很多页面都说Optional不应将其用于私有实例变量,而应由getter返回。
我本以为将私有实例变量作为可选变量仍然有用。如果有人查看我的代码,他们可以看到值可以为空,而不必检查文档以查看是否可以返回null。
在Scala中,从不使用null,只有在与Java互操作的情况下才使用null。如果值可以为null,建议始终使用可选值。这种方法对我来说更有意义。
这是提及它的页面:
https://blog.joda.org/2015/08/java-se-8-optional-pragmatic-approach.html
这是示例代码。
private final String addressLine; // never null
private final String city; // never null
private final String postcode; // optional, thus may be null
// normal getters
public String getAddressLine() { return addressLine; }
public String getCity() { return city; }
// special getter for optional field
public Optional<String> getPostcode() {
return Optional.ofNullable(postcode);
}
Run Code Online (Sandbox Code Playgroud)
我可以看到的唯一好处是,如果您要序列化对象,则现在可以实现,因为它不会在变量中存储可选内容。
缺点是,在检查getter的返回类型之前,您不知道邮政编码可以为null。如果您不熟悉该代码,则可能会错过此添加操作,从而扩展了类,从而导致空指针异常。
这是一个有关Scala的问题Option。
为什么Java和Scala在使用可选方式方面有区别?
Java 8 中引入的类型Optional<T>主要推荐用于返回类型和结果。因此,每当我在类字段或方法参数中使用它时,我都会在 IntelliJ 中收到警告:
Optional<?>用作字段/参数的类型。
Optional<T>但是,当我在规范构造函数中使用 an 作为记录参数时,我没有收到此警告:
public record AuthenticationResult(
boolean isAuthenticated,
Optional<User> user,
Optional<String> authorizationHeader)
{ }
Run Code Online (Sandbox Code Playgroud)
不使用类型作为参数/字段的做法是否Optional<T>不适用于记录参数,因为字段将始终作为记录自动生成的 getter 方法的返回值进行访问?
或者是因为记录是一项新功能,并且此警告尚未实现,并且在记录中使用可选参数与用作方法参数或字段时具有相同的后果?
Java 8在List接口上引入了一种新的默认方法来对其进行排序.它的签名是:
void sort(Comparator<? super E> c)
Run Code Online (Sandbox Code Playgroud)
文件说:
如果指定的比较器为null,则此列表中的所有元素都必须实现Comparable接口,并且应使用元素的自然顺序.
因此,如果你想按照它的自然顺序排序列表(并且你的元素是可比较的)你必须这样做list.sort(null);,这有点奇怪我的意见.
如果他们使用Optional了文档会说你可以选择提供一个比较器,如果没有提供它,它将假设这些元素已经具有可比性.
一个list.sort(null);通话将被转化成list.sort(Optional.empty());.
因为它是一种暴露于外部世界的方法,我会发现它更准确.
他们为什么不使用新的Optional API呢?
java ×10
java-8 ×5
optional ×4
scala ×2
dictionary ×1
hashmap ×1
if-statement ×1
java-17 ×1
monads ×1
oop ×1
option-type ×1
performance ×1
record ×1