使用谓词<;实现过滤器;T>;在Java8中
为了掌握Java8,我尝试实现一个简单的Repo来存储不同对象的列表 我的出发点是:使用谓词<;实现过滤器;T>;在Java8中,java,java-8,Java,Java 8,为了掌握Java8,我尝试实现一个简单的Repo来存储不同对象的列表 我的出发点是: public class MyRepo { Map<Class, List<?>> repo =new HashMap<>(); public List<?> get(Class c){ List<?> result= repo.get(c); return (result==null)?new Ar
public class MyRepo {
Map<Class, List<?>> repo =new HashMap<>();
public List<?> get(Class c){
List<?> result= repo.get(c);
return (result==null)?new ArrayList<>():(List<?>) result;
}
public void put(Class c,List<?> l){
repo.put(c, l);
}
}
公共类MyRepo{
地图获取(c类){
列表结果=回购获取(c);
返回(结果==null)?新建ArrayList():(列表)结果;
}
公开作废认沽权证(c类,清单l){
回购卖出价(c,l);
}
}
因此,我能够插入列表和检索列表
我的下一步是实现一个通用筛选方法:
public List<?> find(Class c, Predicate<?> predicate){
List<?> result= repo.get(c);
return (result==null)?new ArrayList<>():(List<?>)result.stream().filter(predicate);
}
公共列表查找(类c,谓词){
列表结果=回购获取(c);
返回(result==null)?新建ArrayList():(列表)result.stream().filter(谓词);
}
导致
java: incompatible types: java.util.function.Predicate<capture#1 of ?> cannot be converted to java.util.function.Predicate<? super capture#2 of ?>
java:不兼容类型:java.util.function.Predicate无法转换为java.util.function.Predicate
如何实现通用的find方法
我不得不承认,我不确定,这个设计
Map<Class, List<?>> repo =new HashMap<>();
Map您需要修复您的方法签名。泛型通配符类型本质上是独立的-Java编译器没有理由相信一个?
类型以任何方式与另一个?
类型相关
尝试:
公共列表获取(c类)
公开作废(c类,清单)
公共列表查找(c类,谓词)
这个可配置的
参数允许调用者指定他们想要的任何类型,但也让编译器知道“嘿,这个列表和谓词?这是相同的T
,所以你可以完全进行过滤”首先你应该使你的方法通用,这将让编译器决定要传递的是哪个谓词
,并据此推断特定类型。另外,result.stream().filter(predicate)
将为您提供流
,而不是列表
。您需要在列表中收集流
此外,由于您已经有了get(Class)
方法,因此可以使用该方法代替find()
方法中的repo.get(c)
方法。您也可以在此处使用类:
Map<Class, List<?>> repo =new HashMap<>();
public <T> List<T> get(Class<T> c){
return Optional.ofNullable((List<T>)repo.get(c)).orElse(new ArrayList<>());
}
public <T> void put(Class<T> c,List<T> l){
repo.put(c, l);
}
public <T> List<T> find(Class<T> c, Predicate<T> predicate){
return get(c).stream().filter(predicate).collect(Collectors.toList());
}
map非常感谢。是的,仿制药是更好的解决方案+1表示可选
。
Map<Class, List<?>> repo =new HashMap<>();
public <T> List<T> get(Class<T> c){
return Optional.ofNullable((List<T>)repo.get(c)).orElse(new ArrayList<>());
}
public <T> void put(Class<T> c,List<T> l){
repo.put(c, l);
}
public <T> List<T> find(Class<T> c, Predicate<T> predicate){
return get(c).stream().filter(predicate).collect(Collectors.toList());
}