如何在 Java 中访问 List 的第一个非空项?

And*_*ann 4 java oop null list java-8

所以我有一个方法(我不能改变它的参数,否则这可以通过 HashMaps 变得更容易......稍后会详细介绍),它将一个项目作为参数传递。现在我有一个来自这个其他类的实例列表,其中一个属性与这个项目的类型相同,我想在列表中找到与这个项目对应的实例(其中应该只有一个)。这就是我为找到这个所做的:

List<Instance> instances = ...

public static void checkItems(Item i) {

    List<Instance> n = new ArrayList<>();
    instances.forEach(p -> n.add(p.i == i ? p : null));

    Instance currentInstance = n.get(0); 
    //Instance currentInstance = instances.stream().filter(p -> p.i == i).collect(Collectors.toList()).get(0);

}
Run Code Online (Sandbox Code Playgroud)

您可能会直接注意到两件事:

  1. 我使用了一个条件运算符,它在未通过条件时向列表添加一个空值
  2. 我评论的代码是解决这个问题的另一种尝试

所以在第一种情况下,我放 null 因为它需要你放一些东西,而 null 值可能更容易使用,这就是问题出现的原因:如何访问列表中的第一个非 null 值(没有求助于遍历整个列表来找到它......)?

您可能会注意到,我只是用n.get(0)to分配了列表的第一个值currentInstance,因为我知道只有一个值会通过测试。但是,由于我应用了一些其他代码currentInstance,该值不能为空。

只是对第二点的说明:我试图用流解决它的方式实际上完全按计划工作,除了由于某种原因恢复的实例列表不是原始实例的直接副本。这导致某些属性的值已重置为默认值,因此使此方法无用。

编辑:我只是想提一下,由于我在另一个类中犯了一些愚蠢的错误,streams 方法没有工作,代码没有任何问题,所以我将使用那一点来解决我的问题:D

Pau*_*ton 5

如果你知道只有一个p通过测试,我不知道创建一个带有大量null值的列表有什么意义p

您的问题似乎源于想要使用forEach. 在我看来,你应该几乎总是使用 for 循环而不是 forEach。通过一个简单的for循环,您可以在break找到项目时使用。

详细:

Instance p = null;
for (Instance q : instances) {
    if (q.i == i) {
        p = q;
        break;
    }
}
if (p == null)
    throw new IllegalStateException();   // It wasn't there.
// Do something with p.
Run Code Online (Sandbox Code Playgroud)

  • `forEach()` 真的更像是一个玩具。对于一些极其简单的循环来说,这只是一种方便的语法。 (2认同)