(完全披露:来自一段时间远离Java的Ruby家伙)
Entity[] space;
class Planet extends Entity ...
class Star extends Entity ...
space []数组包含空值,行星和星星的混合。我想只访问该数组中的星号(可能没有。)
在不使用instanceof
答案 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);