java - 根据用户在 Java 8 中选择的属性对列表进行动态排序
问题描述
我正在尝试使用 对其成员属性的列表进行排序Comparator.comparing()
,并且该属性由用户选择。考虑以下情况:
public class MyClass extends BaseClass
{
private String attr1;
private Date attr2;
private ChildClass attr3;
//getter and setter
}
public class ChildClass extends BaseClass
{
private String attr1;
private Date attr2;
private int attr3;
//getter and setter
}
这是我尝试过的,但是有编译错误。
private Map<String, Function<MyClass, ?>> sortingOptions = new HashMap<>();
private String sortBy; //sorting attribute selected by user
@PostConstruct
public void init()
{
//my list to be sort
List<MyClass> list = myService.getList();
sortingOptions.put("attr1", MyClass::getAttr1);
sortingOptions.put("attr2", MyClass::getAttr2);
//......
}
//listener for sorting option changed
public void sortOptionChangedListener()
{
//this line of code having error
list.sort(Comparator.comparing(sortingOptions.get[sortBy]));
}
显示的错误是
The method comparing(Function<? super T,? extends U>) in the type Comparator is not applicable for the arguments (Function<MyClass,capture#3-of ?>)
解决方案
将方法引用简单地存储在您的 Map 中可能比您现在拥有的 Functions 更容易。考虑这个...
public class BaseClass implements Comparable<BaseClass> {
@Override
public int compareTo(BaseClass o) {
// implement this properly
return 0;
}
}
public class MyClass extends BaseClass {
private String attr1;
private Date attr2;
private ChildClass attr3;
//getter and setter
}
public class ChildClass extends BaseClass
{
private String attr1;
private Date attr2;
private int attr3;
//getter and setter
}
private List<MyClass> list;
private Map<String, Comparator<? super MyClass>> sortingOptions = new HashMap<>();
private String sortBy; //sorting attribute selected by user
@PostConstruct
public void init()
{
//my list to be sort
list = myService.getList();
sortingOptions.put("attr1", Comparator.comparing(MyClass::getAttr1));
sortingOptions.put("attr2", Comparator.comparing(MyClass::getAttr2));
sortingOptions.put("attr3", Comparator.comparing(MyClass::getAttr3));
//......
}
public void sortOptionChangedListener()
{
list.sort(sortingOptions.get(sortBy));
}
推荐阅读
- maya - Maya:将 HIK rig 顶部的 FBX 动画与命名空间合并
- r - 从 R 中 dplyr 的过滤器函数计算百分比
- javascript - 在 JavaScript 中使用异步回调调用递归函数
- javascript - 如何将数据从 HTML 保存到 MongoDB?collection() 不是函数错误
- spring-boot - 如何在客户端中存储属性以便在与 Spring Config Server 断开连接时重新启动
- javascript - 使用 sine-ease-in-out 分布在多个步骤中划分范围
- javascript - 类型错误:X 不是函数。Node.js - 快递
- php - 更改数组 PHP 中的索引
- java - Java使用具有多个排序标准的Comparable对对象进行排序
- python - 读取由 Adobe LiveCycle Designer 创建的 PDF 中的表单域