仅迭代数组的某些成员

时间:2016-02-07 22:43:06

标签: java

(完全披露:来自一段时间远离Java的Ruby家伙)

Entity[] space;

class Planet extends Entity ... 

class Star extends Entity ...

space []数组包含空值,行星和星星的混合。我想只访问该数组中的星号(可能没有。)

在不使用instanceof

的情况下,Java的优雅方式是什么

2 个答案:

答案 0 :(得分:3)

在Java中,你通常会尽量避免使用数组(因为它们在使用数据时会很痛苦)。

因此,第一步是从Collection API中获取代表您的数组的内容。想到List

List<Entity> entities = Arrays.asList(space);

现在,Java 8引入了Stream API。

entities.stream()
    .filter(e -> e != null)
    .filter(e -> e instanceof Star)
    .foreach(e -> doSomethingWithStar((Star) e));

如果您想避免使用instanceof,则需要为Entity课程提供区分星星和其他物体的方法。 boolean isStar()方法可能会实现:

entities.stream()
    .filter(e -> e != null)
    .filter(e -> e.isStar())
    .foreach(e -> doSomethingWithStar((Star) e));

但是,这仍然存在同样的问题:Stream的类型仍为Stream<Entity>,即使您现在知道其中只有Star

Entity转换为Star或其他任何方式的其他方式可能是添加void addStarToList(List<Star> stars)方法,如果它是星号但未添加,则会将实体添加到列表中如果它不是明星的话。

List<Star> stars = new ArrayList<>();
entities.stream()
    .filter(e -> e != null)
    .foreach(e -> e.addStarToList(stars));

答案 1 :(得分:1)

您可以在所有star.doStarSpecificThing()个实例上调用Star,如下所示:

Arrays.stream(space)
  .filter(e -> e instanceof Star)
  .map(e -> (Star) e)
  .forEach(Star::doStarSpecificThing);