Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.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
使用谓词<;实现过滤器;T>;在Java8中_Java_Java 8 - Fatal编程技术网

使用谓词<;实现过滤器;T>;在Java8中

使用谓词<;实现过滤器;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

为了掌握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 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());
}