查找列表是否在索引处包含对象的可选

时间:2019-07-19 07:01:58

标签: java optional

我正在探索使用Optionals。 在下面的情况下,如果列表(包含数据对象)在特定索引处没有对象,我想实例化一个新对象(这里是数据对象)。 使用Optional可以实现吗?

List<Data> dataList = new ArrayList<>();
for (int i = 0; i < dataList.size();i++) {
    Data data = Optional.ofNullable(dataList.get(i)).orElse(new Data()); // this will throw an error of index out of bounds
}

2 个答案:

答案 0 :(得分:2)

Optional,更具体地说Optional.ofNullable()并非旨在捕获传递给其工厂方法的表达式执行中触发的任何异常。他们期望返回nullofNullable().不返回的引用

Optional最初旨在传达/限制一种方法可能返回某件事(空)。
在某些情况下,我们还可以依靠Optional优雅地执行一些null检查。

由于您想在返回列表元素或新对象之前检查列表的大小,因此您不在任何一种情况下。
因此,条件语句,尤其是三元运算符看起来更加适应:

Data data = i < dataList.size() ? dataList.get(i) : new Data();   

答案 1 :(得分:0)

我认为您的代码没有错。对我来说效果很好。 get(i)永远不会在代码中抛出AIOBE,因为它受到size()的保护。

List<Integer> dataList = new ArrayList<>();
dataList.add(1);
dataList.add(null);
for (int i = 0; i < dataList.size(); i++) {
  Integer data = Optional.ofNullable(dataList.get(i)).orElse(new Integer(-1));
  System.out.println(data);
}

输出是1和-1。