当需要对结果调用方法时,如何使用 orElse?
How to use orElse when you need to invoke a method on the result?
我有以下代码打击。我试图找到一种方法来避免 if (something.isPresent())
行并声明 Optional<Something> something
。相反,我想直接链接 Optional.orElse()
方法和 return 结果。但我似乎找不到办法,因为如果找不到元素,该方法需要 return null,如果找到,它需要在 [=18= 之前调用它的方法]ing.
有更好的方法吗?
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
public class OrElseWhat {
private class Something {
private String it;
Something(String it) { this.it = it; }
String getIt() { return it; }
}
private List<Something> somethings = new ArrayList<Something>() {
{
add(new Something("one"));
add(new Something("two"));
add(new Something("three"));
}
};
public String getFourOrNull() {
Optional<Something> something = somethings.stream()
.filter(s -> s.getIt().equals("four"))
.findAny();
if (something.isPresent()) {
return something.get().getIt();
}
return null;
}
}
您可以在您的值仍处于 Optional
形式时使用 map
:
调用该方法
public String getFourOrNull() {
return somethings.stream()
.filter(s -> s.getIt().equals("four"))
.findAny()
.map(Something::getIt)
.orElse(null);
}
来自 maps
的 documentation:
If a value is present, apply the provided mapping function to it, and if the result is non-null, return an Optional describing the result. Otherwise return an empty Optional.
就是说,如果可以的话,听听@Aaron 并删除 orElse
,以便 getFourOrNull
return 成为 Optional
。在使用 Optional
的代码库中,任何方法都不应该 return null
。
我认为您应该将方法的签名更改为 Optional<String>
并且始终 return something
.
Optional
是为这种情况而设计的:它们可以避免 returning 一些非特定值(也许是 null
或 ""
? 或 -1
) 并从您的签名开始明确描述也许您可以 return 某种类型,但并非总是如此。
我有以下代码打击。我试图找到一种方法来避免 if (something.isPresent())
行并声明 Optional<Something> something
。相反,我想直接链接 Optional.orElse()
方法和 return 结果。但我似乎找不到办法,因为如果找不到元素,该方法需要 return null,如果找到,它需要在 [=18= 之前调用它的方法]ing.
有更好的方法吗?
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
public class OrElseWhat {
private class Something {
private String it;
Something(String it) { this.it = it; }
String getIt() { return it; }
}
private List<Something> somethings = new ArrayList<Something>() {
{
add(new Something("one"));
add(new Something("two"));
add(new Something("three"));
}
};
public String getFourOrNull() {
Optional<Something> something = somethings.stream()
.filter(s -> s.getIt().equals("four"))
.findAny();
if (something.isPresent()) {
return something.get().getIt();
}
return null;
}
}
您可以在您的值仍处于 Optional
形式时使用 map
:
public String getFourOrNull() {
return somethings.stream()
.filter(s -> s.getIt().equals("four"))
.findAny()
.map(Something::getIt)
.orElse(null);
}
来自 maps
的 documentation:
If a value is present, apply the provided mapping function to it, and if the result is non-null, return an Optional describing the result. Otherwise return an empty Optional.
就是说,如果可以的话,听听@Aaron 并删除 orElse
,以便 getFourOrNull
return 成为 Optional
。在使用 Optional
的代码库中,任何方法都不应该 return null
。
我认为您应该将方法的签名更改为 Optional<String>
并且始终 return something
.
Optional
是为这种情况而设计的:它们可以避免 returning 一些非特定值(也许是 null
或 ""
? 或 -1
) 并从您的签名开始明确描述也许您可以 return 某种类型,但并非总是如此。