使用流来按方法返回值进行排序

时间:2017-03-11 14:42:14

标签: java

我有这个方法返回单元可以感知的 environment 对象的列表,但它不会按最接近最远的顺序返回它们:

    List<Environment> = gameWorld.returnEnvironmentInCircle(unit.getLocation(), unit.getType().getSensorRadius());

我想创建此列表的流并按以下值重新排序:

    unit.getLocation().distanceTo(environment.getLocation())

此功能通过简单地计算感测环境的单元与其感测的环境对象之间的距离来起作用。

这是我的尝试,但显然不起作用:

           List<Environment> environmentList = gameWorld.returnEnvironmentInCircle(unit.getLocation(), unit.getType().getSensorRadius());
           List<Environment> environmentStream =   environmentList.stream()
                                            .sorted(environment -> unit.getLocation().distanceTo(environment.getLocation()));
           return environmentStream;

我确定这里有多个问题,所以感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

sorted()期待一个比较器。比较器基本上是一个带有两个Environment对象的函数,并返回一个整数。您正在传递一个采用单一环境的函数,并返回一段距离。

此外,您尝试将Stream<Environment>分配给List<Environment>类型的变量

你不远,但是:

List<Environment> sortedList = 
    environmentList.stream()
                   .sorted(Comparator.comparing(environment -> unit.getLocation().distanceTo(environment.getLocation())))
                   .collect(Collectors.toList());

答案 1 :(得分:2)

您似乎有正确的想法,但是您忘记创建esc-d以在Comparator方法中使用并将流收集回列表:

sotrted

虽然这应该有用,但值得注意的是,使用流有点过分 - 你可以直接使用List#sort(Comparator)

List<Environment> environmentList = 
    gameWorld.returnEnvironmentInCircle(unit.getLocation(), 
                                        unit.getType().getSensorRadius());

List<Environment> sortedEnvironmentList =
    environmentList.stream()
                   .sorted(Comparator.comparing(
                       unit -> unit.getLocation()
                                   .distanceTo(environment.getLocation()))
                   .collect(Collectors.toList());