在Stackoverflow上已经有很多关于在Java 中使用Optional的正确方法的讨论(像这样的讨论,或者这个)
截至目前,在Java中使用Optional作为类成员被广泛认为是一种代码气味,甚至因故意不实现Serializable接口而气馁.此外,我们应该在DTO,构造函数和方法的输入参数中避免它.从视图中的一切OOP点我迄今大约读可选吸引我的原因.
我的问题是,Scala的FP方面是否会以某种方式改变某些东西我们应该使用Optional?特别是因为Scala 中Optional的实现似乎更丰富.我发现很多文章描述了如何在Scala中使用它,但是没有一篇文章在我应该使用它时何时耗尽主题,何时不应该使用它.
假设我的项目中有这个代码:
public List<T> getAll(Integer parameter) {
if(parameter != null && parameter > -1) {
// do something here
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:如何进行检查Optional而不是使用if,或者是否还有其他可以使用的东西?
是否有一个库(例如Apache,Guava)提供了List<T>一个方法
void add(Optional<T> element)
Run Code Online (Sandbox Code Playgroud)
如果元素存在,则添加元素(如果是,则为无操作!element.isPresent())?显然很容易实现,但似乎有人可能已经做过这样一个显而易见的事情.
例如:
private String test(Optional myOptional)
{
myOptional.ifPresent(() -> return "1");
return "0";
}
Run Code Online (Sandbox Code Playgroud)
所以当我调用test(myOptional)时,它将返回"1";
我的一个朋友建议我在DTO中初始化类型为(ArrayList)且仅类型为ArrayList的DTO字段,以避免NullPointerException
public class fooDto {
private SomeClasse someClasse = new SomeClasse();
private ArrayList<Bar> bars = new ArrayList();
}
Run Code Online (Sandbox Code Playgroud)
我们应该做他的吗?这是一个好习惯吗
以其他方式,是否应该使用“ = new SomeClasse()”?
有没有一种“不错”的方法来创建 Optional 对象的副本?
例如,说我有一个方法
Optional<Obj> doSomeStuff(Optional<Obj> input){
if(something){
return Optional.copyOf(input); // does this exist in some Guava library or something?
}
// ...
}
Run Code Online (Sandbox Code Playgroud)
基本上,我想要具有不变性,这样我就不会传递相同的 Optional ,如果something被触发,那么我想确保我创建一个全新的 Optional 与 Optional 的内容相同input(无论它是否为空) .
有什么干净的方法可以做到吗?该Optional.copyOf方法不存在。
我读了为什么Java 8的Optional不能用在参数中.但是Optional(Int|Long|Double),有什么理由反对使用它们作为输入参数?
正如我所理解的那样,它们不能是空的,而是null(Optional<X>输入参数中的主要参数参数),但可能还有其他的珊瑚礁?我应该使用OptionalInt或Integer使用null而不是null重视?
我试图找到使用Java最简洁(和有意义)的方法,Optional从a读取第一个值Optional<String>并返回String(如果存在),或返回"NOT_FOUND".这是我正在使用的代码:
public static String getValue(Optional<String> input) {
return input.ifPresent(val -> val.get()).orElse("NOT_FOUND")
}
Run Code Online (Sandbox Code Playgroud)
Optional的方法显然有非常特殊的用途,但API让我感到困惑.
更新(4/13/2018):
我的问题中的代码不正确,因为如果我认为val是Optional中的值,那么val.get()没有任何意义.谢谢你指出这一点,@ okttman.
另外,我在接受的答案的注释中添加了我的问题的另一部分,即我需要一种方法来操作String值,如果存在,在返回之前.将orElse("NOT_FOUND")仍然适用,如果选不包含值.那么OptionalAPI 的可接受用途是什么来实现以下目标呢?
public static String getValue(Optional<String> input) {
return input.isPresent() ? input.get().substring(0,7).toUpperCase() : "NOT_FOUND";
}
Run Code Online (Sandbox Code Playgroud)
@Aominè的回答和后续评论都涉及这个问题的两个部分.
我正在尝试学习如何Optional在Java中使用- 但这似乎不正确我在做什么.
User user = null;
public AuthCheck(User user) throws Exception {
if (user == null) {
throw new Exception("No user!");
}
if (!(user.getStuff() != null && !user.getStuff().isEmpty())) {
throw new Exception("User has no stuff");
}
this.user = user;
}
Run Code Online (Sandbox Code Playgroud)
这是我尝试使用Optional以下方法转换它:
Optional<UserOptional> user;
public AuthCheckOptional(Optional<UserOptional> user) throws Exception {
user.orElseThrow(() -> new Exception("No User!"));
user.map(UserOptional::getStuff)
.orElseThrow(() -> new Exception("User has no stuff"));
this.user = user;
}
Run Code Online (Sandbox Code Playgroud)
我想我不需要两次单独检查.另外我相信我已经改变了逻辑,因为IsEmpty()没有发生.
java ×9
optional ×6
java-8 ×4
collections ×1
dto ×1
guava ×1
if-statement ×1
lambda ×1
oop ×1
scala ×1