首页 > 解决方案 > 如何在 java 8 中使用 IntStream 返回一个升序数组列表?

问题描述

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

  public ArrayList<Entity> entities(){return entities;}
  ArrayList<Entity> entities=new ArrayList<>();

然后我创建了一个包含 x、y 和半径作为字段的子类 rock:

record Rock(int x,int y,int radius) implements Entity{
  //Some method
  }

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

  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();    
    }

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

有没有办法实现它?谢谢。

标签: javajava-stream

解决方案


你可以这样做

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()));

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


推荐阅读