按嵌套对象的一个​​属性对对象数组进行排序

时间:2015-11-17 09:56:50

标签: java arrays

我需要通过一个对象属性的一个属性来比较一个对象数组 我在做:

List<Sell> collect = sells.stream()
        .sorted(Comparator.comparing(Sell::getClient.name, String::compareToIgnoreCase))
        .collect(Collectors.toList());

它没有编译,没有人知道怎么办?

感谢。

3 个答案:

答案 0 :(得分:4)

这是导致错误的代码部分

Sell::getClient.name

您可以创建对特定类型的任意对象的(静态或非静态)方法的引用。对getClient类型的任何对象的Sell方法的引用如下所示:

Sell::getClient

但方法引用不是对象,也没有成员可以访问。使用此代码,您尝试访问引用的成员变量(并且可以&#39;)

Sell::getClient.name

此外,方法引用不是类,因此您无法从它们获取另一个方法引用。如果你尝试过,你就无法做到这一点:

Sell::getClient::getName

@mlk提供了特定案例的正确语法:

  1. x -> x.getClient().name
  2. Sell::getClientName(不一定是静态方法)

答案 1 :(得分:0)

我无法看到您的代码,或者您收到的错误。所以这是猜测。

我相信你想要

Test

你想在返回时调用一个方法,所以你需要创建一个匿名函数。

您的另一个选择是:

class Test {

    // I assume that Client looks like this.
    static class Client {
        public String name;
    }

    // And that Sell looks like this.
    // I'm sure your Client and Sell are bigger, but this is all 
    // that matters for now. 
    static class Sell {
        public Client getClient() { return null; }
    }

    public static void main (String[] args) throws java.lang.Exception
    {
        List<Sell> sells = new ArrayList<>();
        sells.stream().sorted(Comparator.comparing(x -> x.getClient().name, String::compareToIgnoreCase))
    }
}

答案 2 :(得分:0)

为了访问嵌套属性并以相反的顺序排序,我这样做是:

Comparator<Sell> comparator = Comparator.comparing(h -> h.getAudit().getCreatedTs());
    sells.sort(comparator.reversed());