当前位置:   article > 正文

Java Stream流对多个字段动态指定字段排序_java stream 多字段排序

java stream 多字段排序

    Java 8 的 Stream 使用了函数式编程模式,它可以被用来对集合或数组进行链状流式的排序就需要搬出Stream sort方法进行排序,重写其中的Comparator。

  本文重点介绍使用Java Stream流排序器Comparator对List集合进行排序的技巧,包括复杂实体对象多字段升降序排序方法。


1为什么采用函数式编程

     函数式编程(Functional Programming)是把函数作为基本运算单元,函数可以作为变量,可以接收函数,还可以返回函数。对函数实例的变量引用,就像对字符串、Map 或任何其他对象的引用一样。函数也可以作为参数传递给其他函数。

     利用Function把Java类中的get方法转换成Function形式,  用全局Map进行储存

  1. static public Map<String, Function> functionMap = new HashMap<>();
  2. <T> void init(T t) {
  3. for (Method temp : t.getClass().getMethods()) {
  4. String aaaa = temp.getName();
  5. if (aaaa.startsWith("get")) {
  6. System.out.println(aaaa);
  7. String fieldName = aaaa.split("get")[1];
  8. Function keyExtractosss11 = (a) -> {
  9. try {
  10. Object obj = temp.invoke(a, null);
  11. return obj;
  12. } catch (IllegalAccessException e) {
  13. e.printStackTrace();
  14. } catch (InvocationTargetException e) {
  15. e.printStackTrace();
  16. }
  17. return null;
  18. };
  19. functionMap.put(lowerFirst(fieldName), keyExtractosss11);
  20. }
  21. }
  22. }


2 排序工具类方法

  1. static public <T> List<T> sort(List<T> userList, List<String> fields) {
  2. Function function = functionMap.get(fields.get(0));
  3. Comparator<T> comparator = null;
  4. for (int i = 0; i < fields.size(); i++) {
  5. String temp = fields.get(i);
  6. if (i == 0) {
  7. comparator = Comparator.comparing(function);
  8. } else {
  9. Function function1 = functionMap.get(temp);
  10. comparator = comparator.thenComparing(function1);
  11. System.out.println(comparator);
  12. }
  13. }
  14. userList = userList.stream().sorted(comparator).collect(Collectors.toList());
  15. return userList;
  16. }

3  示例

       定义一个Studen类,内部含有3个字段,调用调用sort方法可以动态实现对list集合多字段排序。

  1. Method[] getMethods = Student.class.getMethods();
  2. List<Student> userList = new ArrayList<>();
  3. Student student3 = new Student();
  4. student3.setId(1);
  5. student3.setName("1");
  6. student3.setAddress("3");
  7. userList.add(student3);
  8. Student student1 = new Student();
  9. student1.setId(1);
  10. student1.setName("1");
  11. student1.setAddress("2");
  12. userList.add(student1);
  13. Student student2 = new Student();
  14. student2.setId(1);
  15. student2.setName("1");
  16. student2.setAddress("1");
  17. userList.add(student2);
  18. List<String> fields = new ArrayList<>();
  19. fields.add("id");
  20. fields.add("name");
  21. fields.add("address");
  22. List<Student> userList111 = sort(userList, fields);
  23. System.out.println(userList111);
  24. for(Student temp:userList111){
  25. System.out.println("排序"+temp.getId()+";"+temp.getName()+";"+temp.getAddress());
  26. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/596417
推荐阅读
相关标签
  

闽ICP备14008679号