Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.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
如何使用Java8流过滤具有两个列表的对象?_Java_Java 8 - Fatal编程技术网

如何使用Java8流过滤具有两个列表的对象?

如何使用Java8流过滤具有两个列表的对象?,java,java-8,Java,Java 8,我需要过滤包含大量对象的列表。对于这些对象中的每一个,我需要验证是否有任何参数包含其他列表中的某个单词。我已经开发了一种方法来做这件事,但它太长了,我想知道是否有更有效的方法来做这件事 为了更好地理解,可以使用sql编写主要思想: SELECT * FROM PROJECT P WHERE P.NAME LIKE "%JAVA%" OR P.NAME LIKE "%PASCAL%" OR P.PRODUCT LIKE "%JAVA%" OR P.PRODUCT LIKE "%PASCAL% OR

我需要过滤包含大量对象的列表。对于这些对象中的每一个,我需要验证是否有任何参数包含其他列表中的某个单词。我已经开发了一种方法来做这件事,但它太长了,我想知道是否有更有效的方法来做这件事

为了更好地理解,可以使用sql编写主要思想:

SELECT * FROM PROJECT P WHERE P.NAME LIKE "%JAVA%" OR P.NAME LIKE "%PASCAL%" OR P.PRODUCT LIKE "%JAVA%" OR P.PRODUCT LIKE "%PASCAL% OR. P.ADDRESS LIKE "%JAVA" OR P.ADDRESS LIKE "%PASCAL%";
在Java中,我是这样写的:

private List<Projeto> filtraResultado(List<Projeto> projetosAssinados, String[] filtros){
List<Projeto> result = new ArrayList<Projeto>();
for(Projeto p: projetosAssinados) {
    if(existeFiltroBuscadoNosCamposDePesquisa(p.getDsProjeto(), filtros) ||
       existeFiltroBuscadoNosCamposDePesquisa(p.getNomeProjeto(), filtros) ||
       existeFiltroBuscadoNosCamposDePesquisa(p.getSetor(),filtros) ||
       existeFiltroBuscadoNosCamposDePesquisa(p.getUn(), filtros) ||
       existeFiltroBuscadoNosCamposDePesquisa(p.getProcessosModelados(),filtros)||
       existeFiltroBuscadoNosCamposDePesquisa(p.getServicosPrestados(),filtros) ||
       existeFiltroBuscadoNosCamposDePesquisa(p.getTecnologias(),filtros)||
       existeFiltroBuscadoNosCamposDePesquisa(p.getDetalhamento(),filtros)) {
            result.add(p);
    }

}
return result;

}

通过创建包含过滤器元素的
集合,可以提高方法的时间复杂度。这样,对特定元素的搜索将是
O(1)
,而不是
O(n)

私有列表过滤器sultado(列表项目助理,字符串[]过滤器){
Set filterSet=Arrays.stream(filters)
.map(字符串::toLowerCase)
.map(字符串::trim)
.collect(收集器.toSet());
列表结果=新建ArrayList();
用于(项目p:Projetoassinados){
boolean contained=Stream.of(p.getDsProjeto(),p.getNomeProjeto(),
p、 getSetor(),p.getUn(),p.getProcessosModelados(),
p、 getServicosPrestados(),p.getTecnologias(),p.getDetalhamento())
.filter(对象::非空)
.map(字符串::toLowerCase)
.anyMatch(过滤器集::包含);
如有(已包含){
结果:添加(p);
}
}
返回结果;
}

对于大输入,这应该比您的方法快得多。

要比较两个
列表
,您需要
anyMatch()
和两个列表之间的流。但是,如果您要检查
过滤器
,我假设该列表中的每个记录都不同,这可以很容易地转换为使用
,这将减少时间并加快速度

例如:

List< String > filterList = Arrays.asList( "z" );
List< String > toCheckList = Arrays.asList( "z", "b", "a", "q", "w" );

boolean contains = toCheckList.stream( ).anyMatch( list -> filterList.stream( ).anyMatch( filter -> StringUtils.containsIgnoreCase( filter, list ) ) );

    if ( contains ) {
        System.out.println( "Contains" );
        //your logic
    }

如果您的过滤器
列表
可以更改为代码上的
设置
,请考虑一下。

我认为您的主要问题是过滤器(?)
过滤器
,适用于所有这些变量,而不是每个变量一组过滤器。现在你可以说是在把每件事都和每件事做比较。也许你可以重新设计这个部分?没错,我有一个对象列表,每个对象都有几个属性。我有一个字符串列表。我需要检查这些字符串中是否至少有一个在这些属性中。
private List<Projeto> filtraResultado(List<Projeto> projetosAssinados, String[] filtros) {
    Set<String> filterSet = Arrays.stream(filtros)
            .map(String::toLowerCase)
            .map(String::trim)
            .collect(Collectors.toSet());

    List<Projeto> result = new ArrayList<Projeto>();

    for (Projeto p : projetosAssinados) {
        boolean contained = Stream.of(p.getDsProjeto(), p.getNomeProjeto(),
                p.getSetor(), p.getUn(), p.getProcessosModelados(), 
                p.getServicosPrestados(), p.getTecnologias(), p.getDetalhamento())
            .filter(Objects::nonNull)
            .map(String::toLowerCase)
            .anyMatch(filterSet::contains);

        if (contained) {
            result.add(p);
        }
    }

    return result;
}
List< String > filterList = Arrays.asList( "z" );
List< String > toCheckList = Arrays.asList( "z", "b", "a", "q", "w" );

boolean contains = toCheckList.stream( ).anyMatch( list -> filterList.stream( ).anyMatch( filter -> StringUtils.containsIgnoreCase( filter, list ) ) );

    if ( contains ) {
        System.out.println( "Contains" );
        //your logic
    }
Set< String > filterList = Arrays.asList( "z", "b" ).stream( ).collect( Collectors.toSet( ) );
List< String > toCheckList = Arrays.asList( "z", "b", "a", "q", "w" );
boolean contains = toCheckList.stream( ).anyMatch( list -> filterList.contains( list ) );

    if ( contains ) {
        System.out.println( "Contains" );

        //your logic
    }