如何在 java 8 中使用 IntStream 返回升序数组列表?

Pik*_*Sir 1 java java-stream

我对 IntStream 很新鲜,现在假设我有一个 Arraylist 保留了一些实体:

  public ArrayList<Entity> entities(){return entities;}
  ArrayList<Entity> entities=new ArrayList<>();
Run Code Online (Sandbox Code Playgroud)

然后我创建了一个具有 x、y 和半径作为字段的子类岩石:

record Rock(int x,int y,int radius) implements Entity{
  //Some method
  }
Run Code Online (Sandbox Code Playgroud)

现在我想返回半径从大到小排列的岩石:

  OptionalInt findRock(ArrayList<Entity> es){
    //This one returns the rock in a stored order, but I want get the rock sequence from big radius to small radius
    return IntStream.range(0,es.size()).filter(i->es.get(i) instanceof Rock).findFirst();    
    }
Run Code Online (Sandbox Code Playgroud)

例如,如果我有rock1 which radius == 15, rock2 which radius == 10, rock3 which radius == 20,它将返回rock3 -> rock1 -> rock2

有什么方法可以实现吗?谢谢。

Taz*_*voo 6

你可以这样做

entities.stream()
        .filter(Rock.class::isInstance)
        .map(Rock.class::cast)
        .sorted(Comparator.comparingInt(Rock::getRadius))
        .forEach(rock -> System.out.println("Rock with radius " + rock.getRadius()));
Run Code Online (Sandbox Code Playgroud)

Comparator.comparing(Rock::getRadius).reversed()如果您想要相反的顺序,请使用。你不需要一个IntStream.