代码之家  ›  专栏  ›  技术社区  ›  Newbie

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

  •  2
  • Newbie  · 技术社区  · 7 年前

    我正在尝试使用 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 ?>)
    
    3 回复  |  直到 7 年前
        1
  •  5
  •   Clint Munden    7 年前

    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));
    }
    
        2
  •  0
  •   Shark    7 年前

    public static <T, U extends Comparable<? super U>> Comparator<T> comparing(
            Function<? super T, ? extends U> keyExtractor)
    {
        Objects.requireNonNull(keyExtractor);
        return (Comparator<T> & Serializable)
            (c1, c2) -> keyExtractor.apply(c1).compareTo(keyExtractor.apply(c2));
    }
    

        3
  •  -1
  •   Jai    7 年前

    private Map<String, Function<MyClass, ? extends Comparable>> sortingOptions = new HashMap<>();
    

    sortingOptions list.sort()

    @SuppressWarnings("unchecked")
    private <T, U extends Comparable<U>> Function<? super T, ? extends U> getComparator(String sortBy) {
        return (Function<T, U>) sortingOptions.get(sortBy);
    }
    

    list.sort(Comparator.comparing(getComparator(sortBy)));