【问题标题】:Dereferenced Int Value With Lambdas使用 Lambda 取消引用的 Int 值
【发布时间】:2017-09-15 01:25:49
【问题描述】:

我正在尝试排序并打印一个按 ID 排序的ArrayList

clientArr.sort( (p1, p2) -> p1.getAccount().getID().compareTo(p2.getAccount().getID()) );
for(Client client : clientArr)
    System.out.println(client);

我相信我的问题是因为 p1p2 期望返回对象,但它们得到了 int 值。我该如何解决这个问题?

ArrayList 存储客户端对象。 Client 类包含 String 值(在此示例中不重要),它创建 Account 对象的实例。在 Account 类中存储了 int ID 值。这就是我需要的价值

【问题讨论】:

  • 我试图使用 lambdas。 @OusmaneMahyDiaw

标签: java sorting arraylist lambda java-8


【解决方案1】:

使用Integer.compare(int, int)点赞,

clientArr.sort((p1, p2) -> Integer.compare(p1.getAccount().getID(), 
                                           p2.getAccount().getID()));

另外,您的 for-each 循环可以重写为

clientArr.forEach(System.out::println);

【讨论】:

  • 啊,使用整数解决了我的问题。谢谢你。请问,与我的方式相比,像这样编写 for 循环有什么好处?
  • @NickM 它也在使用 lambdas,它会消除一行代码。我想不出其他原因。
  • 您还可以为您的 Collection::sort 方法调用创建一个比较器,它会为您执行 Integer::compare 调用和 getter 调用:clientArr.sort(Comparator.comparingInt(p -> p .getAccount().getId()));
  • @ElliottFrisch Gotcha。这是一个很好的方式来看待它,谢谢你的建议。
  • 因为clientArr 尽管它的名字是List(否则你不能在上面调用sort),Stream.of(clientArr) 应该是clientArr.stream(),但它会是偶数使用起来更简单clientArr.forEach(System.out::println);。您编写它的方式,它创建一个单一的元素流,换句话说,相当于System.out.println(clientArr);,它恰好也打印列表内容,但在一行中。
【解决方案2】:

您可以一次完成所有这些工作,并以 Java8 建议的功能方式完成 -

使用 Stream API 的 sorted 并提供一个比较器作为方法参考。

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;

public class ComparingTest {

    public static void main(String[] args) {
        List<Test> mTestList = new ArrayList<>();
        mTestList.add(new Test(10));
        mTestList.add(new Test(1));
        mTestList.add(new Test(5));
        mTestList.add(new Test(4));
        mTestList.add(new Test(2));
        mTestList.add(new Test(8));
        mTestList.add(new Test(7));

        mTestList.stream().sorted(Comparator.comparingInt(Test::getId)).forEach(System.out::println);
    }
}

class Test {
    public int id;

    Test(int id) {
        this.id = id;
    }

    public int getId() {
        return id;
    }

    @Override
    public String toString() {
        return String.valueOf(getId());
    }
}

【讨论】:

    猜你喜欢
    • 2017-06-17
    • 1970-01-01
    • 2022-11-15
    • 2013-09-16
    • 1970-01-01
    • 2013-10-07
    相关资源
    最近更新 更多