【问题标题】:Is it possible to get class fields in a sorted way?是否可以按排序方式获取类字段?
【发布时间】:2016-04-21 05:31:20
【问题描述】:

可能是一个愚蠢的问题,但是...From the docs,我知道在 java 中我在java.lang.Class<T> 上有一个名为getFields() 的方法,它将返回一个Field 对象数组,我也知道结果根本没有以任何方式排序。

返回一个包含反映所有字段对象的数组 由 this 表示的类或接口的可访问公共字段 类对象。返回的数组中的元素未排序,并且 没有任何特定的顺序。该方法返回一个数组 如果类或接口没有可访问的公共字段,则长度为 0,或者 如果它表示数组类、原始类型或 void。

现在,如果我想对这些字段进行排序怎么办?有没有一种方法可以为我返回它们?还是我必须自己整理?

来自this question 我知道我可以使用Comparator 对它们进行排序。我只是想知道我是否真的需要自己做这个额外的步骤。

【问题讨论】:

  • 标准 JDK 没有任何方法可以满足您的需求,因此如果您仅限于 JDK,则只需执行此额外步骤。现在,如果您对外部库感兴趣,我发现了类似 stackoverflow.com/a/15075633/1393766 的内容。
  • 您会寻找什么样的一般解决方案,无需您对它们进行排序即可对它们进行排序?我并不是要轻率,但是如果它们没有排序,并且您希望它们排序……您需要对它们进行排序。也就是说,如果您不想编写 Comparator,您可能需要查看 Guava 的 Ordering.usingToString()
  • "如果你不想写 Comparator" 类似的东西哈哈。我的好奇多于懒惰。此外,Guava 提供了不错的解决方案。
  • 额外的步骤可能看起来像Arrays.sort(fields, comparing(Field::getName)); - 看起来还不错,是吗?
  • @assylias 应该可能会发布一个答案。

标签: java arrays class sorting


【解决方案1】:

根据属性对对象数组进行排序可以写成一行:

Field[] fields = String.class.getDeclaredFields();
Arrays.sort(fields, comparing(Field::getName));

使用静态导入:import static java.util.Comparator.comparing;

【讨论】:

  • 至于其他 cmets,我知道我必须对其进行排序,并且您向我展示了一种非常好的方法。谢谢!
  • 请注意,此解决方案需要 Java 1.8 或更高版本。如果您使用的是早期版本,它将无法工作:java.util.Comparator.comparingjava.util.function.Function 是在 1.8 中引入的。 (我工作的地方还有一些运行 Java 1.6 的旧服务器......)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-11
  • 1970-01-01
  • 2016-05-31
  • 1970-01-01
  • 1970-01-01
  • 2016-05-17
相关资源
最近更新 更多