我有List对象,并且如果列表中的第一个元素不为null或为空,则需要使用它。
我使用Java编写以下代码,现在我想将其转换为Java 8。
List<DD> container
A<DD,DI> a;
if(container!=null || !container.isEmpty()){
for(DD dd:container)
{
a = dd.getPrescription();
break;
}
}
我这样转换它。
DD detail = container.stream().findFirst().get();
我需要知道这是正确的吗?
答案 0 :(得分:9)
您当前的代码中存在一个严重缺陷,即
if(container!=null || !container.isEmpty())
除非条件运算符更改为NullPointerException
,否则它仍然可以抛出container == null
(在&&
时)。发布下面的实现将是我建议遵循的。
从条件上讲,如果不满足条件,您需要处理一些默认值:
DD detail = container.stream().findFirst().orElse(null); // or some default value instead of 'null'
如果container
本身可以为空,请使用
DD detail = container != null ?
container.stream().findFirst().orElse(null) : null;
如果需要此对象的处方,请使用map
作为:
container.stream().findFirst().map(DD::getPrescription).orElse(null)
// ^^
// return type of prescription then
对于Java-9,这可能更简单:
A<DD, DI> basePrescription = Stream.ofNullable(container) // Java-9 API
.flatMap(List::stream)
.findFirst()
.map(DD::getPrescription)
.orElse(null);
答案 1 :(得分:5)
这更容易:
A<DD,DI> a = container.get(0).getPrescription();
虽然这是原始代码的直接翻译,但您可能打算这样做:
A<DD,DI> a = container != null && !container.isEmpty()
? container.get(0).getPrescription()
: null;
答案 2 :(得分:2)
从JDK9开始,有一个新的方法 T requireNonNullElse(T obj, T defaultObj) ,如果该方法的第一个参数为非null,则基本上返回第一个参数,否则返回第二个参数为非空的第二个参数。
因此,我们可以将您的代码简化为:
Objects.requireNonNullElse(container, Collections.emptyList())
.stream()
.findFirst()
.map(DD::getPrescription);
这将返回一个Optional<T>
,其中T
是getPrescription
的任何类型。根据上下文以及是否合适,您可能要使用.orElse(null);
来获取可选包含的值,或者使用null
值,但是Optional<T>
API中还有其他几种方法从可选值中提取值时,您可能会发现更有用。
答案 3 :(得分:1)
The findFirst() method finds the first element in a Stream. This method is used when you specifically want the first element from a sequence.
a) container.stream().findFirst().orElse(null);
b) container.stream().filter(Objects::nonNull).findFirst().orElse(null);
c)container.stream().filter(StringUtils::isNotBlank).findFirst();
or as lambdas:
d)container.stream().filter(s -> StringUtils.isNotBlank(s)).findFirst();
e)container.stream().filter(StringUtils::isNotBlank).findFirst()
供参考:-http://www.geekabyte.io/2015/01/using-optional-effectively-in-java-8.html