Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 仅迭代数组的某些成员_Java - Fatal编程技术网

Java 仅迭代数组的某些成员

Java 仅迭代数组的某些成员,java,Java,完全披露:来自一个远离Java一段时间的Ruby家伙 Entity[] space; class Planet extends Entity ... class Star extends Entity ... space[]数组包含空值、行星和恒星的混合物。我只想访问阵列中可能没有的星星 如果不在Java中使用instanceof,您通常会尝试避免使用数组,因为使用数组是件麻烦事 因此,第一步是从集合API中获取一些表示数组的内容。我想到了一张清单 List<Entity>

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

Entity[] space;

class Planet extends Entity ... 

class Star extends Entity ...
space[]数组包含空值、行星和恒星的混合物。我只想访问阵列中可能没有的星星


如果不在Java中使用instanceof,您通常会尝试避免使用数组,因为使用数组是件麻烦事

因此,第一步是从集合API中获取一些表示数组的内容。我想到了一张清单

List<Entity> entities = Arrays.asList(space);
如果要避免使用instanceof,需要为实体类提供一种区分星星和其他对象的方法。布尔isStar方法可能实现以下目标:

entities.stream()
    .filter(e -> e != null)
    .filter(e -> e.isStar())
    .foreach(e -> doSomethingWithStar((Star) e));
然而,这仍然存在同样的问题:流的类型仍然是流,即使您现在知道其中只有星星

将实体转换为星型或无实体的其他方法可以是添加一个void addstartoListStars方法,如果实体是星型,则将其添加到列表中,但如果实体不是星型,则不添加任何内容

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

在Java中,您通常会尝试避免使用数组,因为使用数组是件麻烦事

因此,第一步是从集合API中获取一些表示数组的内容。我想到了一张清单

List<Entity> entities = Arrays.asList(space);
如果要避免使用instanceof,需要为实体类提供一种区分星星和其他对象的方法。布尔isStar方法可能实现以下目标:

entities.stream()
    .filter(e -> e != null)
    .filter(e -> e.isStar())
    .foreach(e -> doSomethingWithStar((Star) e));
然而,这仍然存在同样的问题:流的类型仍然是流,即使您现在知道其中只有星星

将实体转换为星型或无实体的其他方法可以是添加一个void addstartoListStars方法,如果实体是星型,则将其添加到列表中,但如果实体不是星型,则不添加任何内容

List<Star> stars = new ArrayList<>();
entities.stream()
    .filter(e -> e != null)
    .foreach(e -> e.addStarToList(stars));
您可以在所有星形实例上调用star.doStarSpecificThing,如下所示:

Arrays.stream(space)
  .filter(e -> e instanceof Star)
  .map(e -> (Star) e)
  .forEach(Star::doStarSpecificThing);
您可以在所有星形实例上调用star.doStarSpecificThing,如下所示:

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

为什么要避免使用instanceof??出于设计目的,可能使用访问者模式,但可能是因为我更喜欢使用一些多态性模式。如果您更喜欢多态性,为什么不在实体实例上操作,而不是在星形或行星上操作?为什么要避免instanceof??出于设计目的,可能使用访问者模式,但可能是因为我更喜欢使用一些多态性模式。如果您更喜欢多态性,为什么不在实体实例上操作,而不是在Star或Planet上操作?您不需要两个过滤器e->e!=空(&e)STAR实例当然不需要。然而,把它们分开会让事情变得更清楚,对我来说不是。重要的是这是恒星的瞬间。如果清晰性确实是一个优先考虑的问题,那么更喜欢方法引用lambdas,这样你就有了一个简单、清晰的名称,而不是大量的嵌入代码。@erickson,一旦你有了一个可以调用的方法,你就需要再次检查null。实际上,null instanceof Star的计算结果将为false,因此,您不需要显式的空检查。您不需要两个过滤器e->e!=空(&e)STAR实例当然不需要。然而,把它们分开会让事情变得更清楚,对我来说不是。重要的是这是恒星的瞬间。如果清晰性确实是一个优先考虑的问题,那么更喜欢方法引用lambdas,这样你就有了一个简单、清晰的名称,而不是大量的嵌入代码。@erickson,一旦你有了一个可以调用的方法,你就需要再次检查null。实际上,null instanceof Star的计算结果将为false,因此,您不需要显式的空检查,但过滤器的输出仍然是一个实体。instanceof不在Java中强制转换:@埃里克,哈格斯特罗姆是的,这是必要的。Stream.filter的结果是Stream。它是,但筛选器的输出仍然是一个实体。instanceof不在Java中强制转换:@埃里克,哈格斯特罗姆是的,这是必要的。Stream.filter的结果是Stream。