有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

    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_" );

我想使用Java Streams,但我是这些API的新手,所以我编写了以下代码:

    mapping.values().forEach( prefix ->
            roles.addAll( stream( groups ).parallel().filter(
                    group -> group.startsWith( prefix )
            ).map(
                    group -> group.split( "," )[0].substring( prefix.length() )
            ).collect( toList() ) )
    );
    

结果是:

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

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


共 (1) 个答案

  1. # 1 楼答案

    这种逻辑效率低下,而且与流的使用无关

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

    Set<String> filter = new HashSet<>(mapping.values());
    stream( groups ).filter(g -> filter.contains(g.split("_")[0] + "_")). ...
    

    如果你在过滤器上循环,你最终会在组上循环n次,使复杂度为O(n^2),而不是线性

    其余的在我看来很好:如果使用流API或纯旧for循环,就不会有太大的变化。只是要知道,如果你有大量的组,并行化流是有意义的;对于少数组来说,管理并行化的开销实际上会使执行速度变慢