泛型对象映射的Order元素---通过对象的泛型属性---Lamda-Java
我需要一个方法来通过对象的泛型属性对泛型对象的映射进行排序。我尝试了下面的代码,类似于我在StackOverFlow上找到的其他示例,但没有找到任何具有泛型属性的示例。我不是lamda的专家,所以对我来说很难理解清楚一些逻辑 我在比较中得到错误;他对我说: “找不到符号:方法比较(CAP#1) 位置:类对象,其中CAP#1是新类型变量: CAP#1扩展了对象的捕获范围 例如:泛型对象映射的Order元素---通过对象的泛型属性---Lamda-Java,java,lambda,Java,Lambda,我需要一个方法来通过对象的泛型属性对泛型对象的映射进行排序。我尝试了下面的代码,类似于我在StackOverFlow上找到的其他示例,但没有找到任何具有泛型属性的示例。我不是lamda的专家,所以对我来说很难理解清楚一些逻辑 我在比较中得到错误;他对我说: “找不到符号:方法比较(CAP#1) 位置:类对象,其中CAP#1是新类型变量: CAP#1扩展了对象的捕获范围 例如: 我有一个属性为“name”的对象“car” 我有一个Hashmap,包含以下项目:键1,名为福特的对象---键2,名为
- 我有一个属性为“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点异常
saMap.values()!=null
总是true
,因为(令人惊讶的是)Java API设计人员/实现人员决定此方法应始终返回非null集合,即如果没有值,则返回空集合。无论如何,这个条件没有效果,它总是真的
aMap!=null
和属性值提取器!=null
,只需抛出,因为使用null
参数调用方法不应该是允许继续的有效调用(fail fast原则)aMap.size()>0实际上并不需要,因为后续的流代码可以毫无问题地处理它,即结果只是一个空列表。对于这种情况,我并不是每次都会故意重复null
(如上所述)
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());
}