【问题标题】:Collect method for streams doesn't work as expected流的收集方法无法按预期工作
【发布时间】:2021-04-27 10:06:12
【问题描述】:

我正在测试流的collect 方法。在这段代码中,我试图通过在第一种情况下使用StringBuilder 和在第二种情况下连接String 从字符串流构建单个字符串。我不明白为什么第二种情况会产生一个空字符串。

    String[] strs = new String[] {"aaaaa", "bbbbbbb", "c", "dd"};
    
    
    StringBuilder sb = Arrays.stream(strs).collect(StringBuilder::new, StringBuilder::append, StringBuilder::append);
    
    System.out.println(sb);
    
    
    String s = Arrays.stream(strs).collect(String::new, String::concat, String::concat);
    
    System.out.println(s);

【问题讨论】:

    标签: java java-stream collect


    【解决方案1】:

    嗯,它不起作用的原因是String 是不可变的。

    String::new 是一个 Supplier<String>,它返回一个空的 String

    而且你的累加器和组合器无法改变它,因为String 是不可变的。

    您的代码与以下效果相同:

    String s = new String ();
    for (String str : strs) {
        s.concat(str);
    }
    

    concat 的调用会产生新的Strings,并且不会影响结果String 的值。

    由于String 是不可变的,您可以使用不可变归约(即使用reduce 而不是collect):

    String s = Arrays.stream(strs).reduce("",String::concat);
    

    这将与以下结果相同:

    String s = "";
    for (String str : strs) {
        s = s.concat(str);
    }
    

    【讨论】:

    • 好的,所以 collect 方法产生了一个可变的归约。谢谢,我认为它的行为就像 reduce 方法一样。
    猜你喜欢
    • 2015-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多