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

Optional for finding if list contains object at index

我正在探索 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
}

我看不出你的代码有什么问题。对我来说效果很好。 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。

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

Optional最初是为了convey/constraint一个方法可能return一个东西或一个东西(空)而设计的。
在某些情况下,我们还可以依靠 Optional 优雅地执行一些 null 检查。

这里您不属于任何这些情况,因为您想在 returning 列表元素或新对象之前检查列表的大小。
因此,条件语句,尤其是三元运算符看起来更适合:

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