基于Java 8中用户选择的属性动态排序列表

New*_*bie 2 java sorting 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
}
Run Code Online (Sandbox Code Playgroud)

这是我试过的,但有编译错误.

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]));
}
Run Code Online (Sandbox Code Playgroud)

显示的错误是

The method comparing(Function<? super T,? extends U>) in the type Comparator is not applicable for the arguments (Function<MyClass,capture#3-of ?>)
Run Code Online (Sandbox Code Playgroud)

小智 5

将方法引用存储在Map中而不​​是现在的函数可能更容易.考虑一下......

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));
}
Run Code Online (Sandbox Code Playgroud)

  • 明确解决方案 但是没有理由为什么`BaseClass`应该实现`Comparable <BaseClass>`; 代码运行正常没有. (2认同)