Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.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
这是使用Java流api的最佳性能方法吗_Java_Java Stream - Fatal编程技术网

这是使用Java流api的最佳性能方法吗

这是使用Java流api的最佳性能方法吗,java,java-stream,Java,Java Stream,我需要从这个字符串数组中创建一个新的字符串列表: String[] groups = { "A_group1,AAAAA", "A_group2", "A_group3", "B_group4", "B_group5", "B_group

我需要从这个字符串数组中创建一个新的字符串列表:

    String[] groups = {
            "A_group1,AAAAA",
            "A_group2",
            "A_group3",
            "B_group4",
            "B_group5",
            "B_group6,BBBBBBB",
            "C_group7",
            "C_group8",
            "C_group9,CCCCC",
    };
    
我必须保留以以下前缀开头的字符串:

    Map<String, String> mapping = new HashMap<>();
    mapping.put( "prefix1", "A_" );
    mapping.put( "prefix2", "B_" );
结果是:

    [group4, group5, group6, group1, group2, group3]        

这是正确的。但是我想知道是否有性能更好的代码

逻辑效率低,与流的使用无关

您的外部循环应该在“groups”上,然后对照映射的值集进行检查,这是O(1)复杂度。比如:

Set<String> filter = new HashSet<>(mapping.values());
stream( groups ).filter(g -> filter.contains(g.split("_")[0] + "_")). ...
Set filter=newhashset(mapping.values());
流(组).filter(g->filter.contains(g.split(“\u”)[0]+“\u”)。。。
如果在过滤器上循环,则最终在组上循环n次,使复杂性为O(n^2),而不是线性


其余的在我看来很好:如果使用流API或普通的旧for循环,则不会有大的变化。请注意,如果您有大量的组,那么并行化流是有意义的;对于少数组来说,管理并行化的开销实际上会使执行速度变慢

对于如此少量的元素,执行并行流甚至流都是不值得的。如果你追求的是速度,那么就使用good old for循环。这个问题可能更适合。你的输入是否有
?否则,
group.split(“,”
如何工作。。。。想知道您是否要为此构建前缀树(trie)以优化查找!抱歉,是的,在极少数情况下,我必须拆分字符串我不知道CodeReview,下次我将询问那里的
映射。values()
返回
集合
,您如何将其分配给
集合
?抱歉,您是对的,编辑我的回答不幸的是,我必须使用
startsWith
,因为我只有string@DiegoMarcolungo如果您能够像示例中那样识别前缀(因为您可能会在下划线上拆分),则修改.filter()调用以检查您的组。如果您无法通过查看组名识别前缀,请再次使用Set.contains()检查组。拆分(“”)[0],如果您非常担心性能,那么您可能需要使用前缀树。
Set<String> filter = new HashSet<>(mapping.values());
stream( groups ).filter(g -> filter.contains(g.split("_")[0] + "_")). ...