Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
泛型对象映射的Order元素---通过对象的泛型属性---Lamda-Java_Java_Lambda - Fatal编程技术网

泛型对象映射的Order元素---通过对象的泛型属性---Lamda-Java

泛型对象映射的Order元素---通过对象的泛型属性---Lamda-Java,java,lambda,Java,Lambda,我需要一个方法来通过对象的泛型属性对泛型对象的映射进行排序。我尝试了下面的代码,类似于我在StackOverFlow上找到的其他示例,但没有找到任何具有泛型属性的示例。我不是lamda的专家,所以对我来说很难理解清楚一些逻辑 我在比较中得到错误;他对我说: “找不到符号:方法比较(CAP#1) 位置:类对象,其中CAP#1是新类型变量: CAP#1扩展了对象的捕获范围 例如: 我有一个属性为“name”的对象“car” 我有一个Hashmap,包含以下项目:键1,名为福特的对象---键2,名为

我需要一个方法来通过对象的泛型属性对泛型对象的映射进行排序。我尝试了下面的代码,类似于我在StackOverFlow上找到的其他示例,但没有找到任何具有泛型属性的示例。我不是lamda的专家,所以对我来说很难理解清楚一些逻辑

我在比较中得到错误;他对我说:

“找不到符号:方法比较(CAP#1) 位置:类对象,其中CAP#1是新类型变量: CAP#1扩展了对象的捕获范围

例如:

  • 我有一个属性为“name”的对象“car”
  • 我有一个Hashmap,包含以下项目:键1,名为福特的对象---键2,名为奥迪的对象---键3,名为菲亚特的对象
  • 地图的第一个元素有键1,第二个元素有键2,第三个元素有键3
  • 我希望在输出中有一个Arraylist,其中:-第一个元素是对象“Audi”,第二个元素是对象“Fiat”,第三个元素是对象“Ford”,以便对3个名称进行排序
为了调用此方法,我将使用以下示例:

ArrayList<Car> SORTED_Cars = get_ListOfObject_SortedByAttribute(myHashMap, car -> car.getName() );
因为我更喜欢在无法排序或映射为空时获取null

下面的代码应该如何工作?

        private static <T> List<T> get_ListOfObject_SortedByAttribute(final Map<?, T> MyMap_Arg,       final Function<T, ?> MY_AttributeValueExtractor__Arg     ) {
        List<T> result = null;
        try {
            if (MyMap_Arg!=null &&  MyMap_Arg.size()>0 && MyMap_Arg.values()!=null){
                if (MY_AttributeValueExtractor__Arg!=null ) {
                    
                    //_____________________________________________________
                    //Crea una lista di oggetti che hanno MY_AttributeValueExtractor_1_Arg!=null; altrimenti applicando '.compare' darebbe exception
                    List<T> MY_LIST__SenzaNull =  MyMap_Arg.values().stream().filter(    o -> MY_AttributeValueExtractor__Arg.apply(o)!=null   ).collect(Collectors.toList()); 
                        
                    //_____________________________________________________
                    //TEST  ********* Ordina la lista di oggetti alfabeticamente in base a MY_AttributeValueExtractor_1_Arg
                    result = MY_LIST__SenzaNull.stream().sorted(  
                        (o1, o2)->  MY_AttributeValueExtractor__Arg.apply(o1).
                        compareTo(  MY_AttributeValueExtractor__Arg.apply(o2)  )  
                            
                    ).
                    collect(Collectors.toList());                        
                        
                    //_____________________________________________________
                        
                } 
            }
        } catch (Exception ex) {
            result=null;
        }
        return result;
    }    
private static List get_ListOfObject_SortedByAttribute(最终映射MY_AttributeValueExtractor__参数){
列表结果=空;
试一试{
如果(MyMap_Arg!=null&&MyMap_Arg.size()>0&&MyMap_Arg.values()!=null){
if(MY_AttributeValueExtractor__Arg!=null){
//_____________________________________________________
//Crea una lista di oggetti che hanno MY_AttributeValueExtractor_1_Arg!=null;altrimenti applicato'.compare'darbbe异常
列出MY_List_uuSenzanull=MyMap_Arg.values().stream().filter(o->MY_AttributeValueExtractor_uuarg.apply(o)!=null).collect(collector.toList());
//_____________________________________________________
//在基础a MY_AttributeValue提取器_1_Arg中测试*********oggetti alfabeticamente的列表顺序
结果=我的列表\uuuu SenzaNull.stream()。排序(
(o1,o2)->我的属性值提取器参数应用(o1)。
比较(我的属性值提取程序参数应用(o2))
).
collect(Collectors.toList());
//_____________________________________________________
} 
}
}捕获(例外情况除外){
结果=空;
}
返回结果;
}    
给定您的代码(为了清晰起见,进行了重构)

使用它可以得到编译时错误

错误:(149,78)java:找不到符号
符号:方法比较(捕获#1个?)
位置:类java.lang.Object
也就是说,代码中没有任何东西可以确保属性具有这样的方法(并且可以进行比较以进行排序)。特别是,
函数attributeValueExtractor)
表示类型
T
映射到类型
,该类型只能是
对象
;而
对象
没有
比较器
方法。(请注意,
Object
没有这样的方法,因为没有任何有意义的方法来比较任意对象)

要修复它(至少),您需要确保您的对象实现这样的方法。所以你的方法是签名

static <T> List<T> getListSortedByAttribute(
                          Map<?, T> aMap, Function<T, ?> attributeValueExtractor)
哪张照片

[奥迪、菲亚特、福特]
至于
List List=getListSortedByAttribute(地图,汽车::getName)
注意,可以使用lambda表达式
(Car-Car)->Car.getName()
,或方法引用
Car::getName
作为方法参数。我选择后者,因为我发现它更短

然后调用会起作用,因为
Car::getName
的返回类型是一个
字符串
,它实现了
Comparable
,因此有一个
compareTo
方法实现

关于代码的注释(我的意见)

  • 当使用像您这样返回
    集合
    类型的方法时,如果这样的方法返回的是
    null
    而不是空集合,那将是非常令人惊讶的——这将导致很多(也是令人惊讶的)
    null点异常
    s
  • 正如注释
    aMap.values()!=null
    总是
    true
    ,因为(令人惊讶的是)Java API设计人员/实现人员决定此方法应始终返回非null集合,即如果没有值,则返回空集合。无论如何,这个条件没有效果,它总是
    真的
  • aMap!=null
    属性值提取器!=null
    ,只需抛出,因为使用
    null
    参数调用方法不应该是允许继续的有效调用(fail fast原则)
  • aMap.size()>0实际上并不需要,因为后续的流代码可以毫无问题地处理它,即结果只是一个空列表。对于这种情况,我并不是每次都会故意重复
    null
    (如上所述)
  • 不要吞并异常,要么抛出(fail fast principle),要么进行有意义的恢复。但是如上所述返回
    null
    并不是一个有意义的恢复
  • 关于上述内容和进一步的更改,您将获得

    static <T, U extends Comparable<U>> List<T> getSortedValues(
                       Map<?, T> aMap, Function<T, U> attributeExtractor) {
    
        Objects.requireNonNull(aMap, "Map to be sorted cannot be null");
        Objects.requireNonNull(attributeExtractor, "Function to extract a value cannot be null");
    
        return aMap
                .values()
                .stream()
                .filter(o -> attributeExtractor.apply(o) != null)
                .sorted(Comparator.comparing(attributeExtractor))
                .collect(Collectors.toList());
    }
    
    静态列表GetSortedValue(
    
    MapHi,首先是一些提示:1.你的代码很难阅读。2.你能提供你的函数:MY_AttributeValueExtract吗
    (o1, o2) -> attributeValueExtractor.apply(o1)
                                       .compareTo(attributeValueExtractor.apply(o2))
    
    static <T> List<T> getListSortedByAttribute(
                              Map<?, T> aMap, Function<T, ?> attributeValueExtractor)
    
    static <T, U extends Comparable<U>> List<T> getListSortedByAttribute(
                              Map<?, T> aMap, Function<T, U> attributeValueExtractor)
    
    public static void main(String[] args) {
        Map<Integer, Car> map = new HashMap<>();
        map.put(1, new Car("Ford"));
        map.put(2, new Car("Audi"));
        map.put(3, new Car("Fiat"));
        map.put(4, new Car(null));
    
        List<Car> list = getListSortedByAttribute(map, Car::getName);
        System.out.println(list);
    }
    
    static <T, U extends Comparable<U>> List<T> getSortedValues(
                       Map<?, T> aMap, Function<T, U> attributeExtractor) {
    
        List<T> result = null;
        try {
            if (aMap != null && aMap.size() > 0) {
                if (attributeExtractor != null) {
                    result = aMap
                              .values()
                              .stream()
                              .filter(o -> attributeExtractor.apply(o) != null)
                              .sorted((o1, o2) -> attributeExtractor.apply(o1).
                                    compareTo(attributeExtractor.apply(o2)))
                              .collect(Collectors.toList());
                }
            }
        } catch (Exception ex) {
            result = null;
        }
        return result;
    }
    
    static class Car {
        private final String name;
    
        Car(String name) { this.name = name; }
    
        String getName() { return name; }
    
        @Override
        public String toString() { return name; }
    
        // code for equals() and hashCode() omitted for brevity
    }
    
    static <T, U extends Comparable<U>> List<T> getSortedValues(
                       Map<?, T> aMap, Function<T, U> attributeExtractor) {
    
        Objects.requireNonNull(aMap, "Map to be sorted cannot be null");
        Objects.requireNonNull(attributeExtractor, "Function to extract a value cannot be null");
    
        return aMap
                .values()
                .stream()
                .filter(o -> attributeExtractor.apply(o) != null)
                .sorted(Comparator.comparing(attributeExtractor))
                .collect(Collectors.toList());
    }