我现在有一个List<String> 我想使用lambda把这个list中的字符串全部循环拼接到一个字符串上,lambda可以实现么?该怎么做呢?
认证高级PHP讲师
使用foreach對StringBuilder這種有副作用,不大符合函數式程式設計。可以這樣
String result = list.stream().collect(Collectors.joining(""));
StringBuilder str = new StringBuilder(); list.forEach(item -> { str.append(item); });
補充回答:為什麼不能把str改成String類型,透過str = str + item來實現字串拼接?
str = str + item
上面的程式碼其實等價於:
final StringBuilder str = new StringBuilder(); list.forEach(new Consumer<String>() { @Override public void accept(String item) { str.append(item); } });
即Lambda的本質其實是匿名內部類,所以str必須是final型別(不過程式碼中的final可以省略),是不可以重新賦值的。
剛看到邀請郵件,抱歉回覆晚了,其實上面叉叉哥已經非常非常專業和準確了,但是既然被邀請,感覺不寫兩句對不起這個郵件,我就把我的一般寫法都列出來,感覺我已經進入到回字有幾種寫法的迂腐境界了。 。 。希望不要罵我:
public static void join1(){ List<String> list = Arrays.asList("11","22","23"); //最传统写法: StringBuilder sb = new StringBuilder(); for(String s : list){ sb.append(s); } System.out.println(sb.toString()); //如果想要加个分隔符,比如逗号,传统写法: sb = new StringBuilder(); for(int i = 0; i < list.size(); i++){ sb.append(list.get(i)); if(i < list.size() - 1){ sb.append(","); } } System.out.println(sb.toString()); //使用commons-lang库写法, 其实这个已经够简单了,就这个功能而言,我很喜欢,而且最最常用: System.out.println(StringUtils.join(list.toArray(), ",")); //进入jdk8时代: System.out.println(list.stream().collect(Collectors.joining())); //jdk8时代,加个分隔符: System.out.println(list.stream().collect(Collectors.joining(","))); }
$這個->
我用rxJava來舉例子吧,用java8的Streaming也是一樣的:
StringBuilder sb = new StringBuilder(); rx.Observable.from(list).subscribe(sb::append);
如果每個item之間要加入分隔符號的話,這次用java8的Streaming哈:
String separator = ","; StringBuilder sb = new StringBuilder(); Stream.of(list).forEach(item -> sb.append(item).append(separator)); sb.deleteCharAt(sb.length() - sepLen);
使用foreach對StringBuilder這種有副作用,不大符合函數式程式設計。可以這樣
補充回答:為什麼不能把str改成String類型,透過
str = str + item
來實現字串拼接?上面的程式碼其實等價於:
即Lambda的本質其實是匿名內部類,所以str必須是final型別(不過程式碼中的final可以省略),是不可以重新賦值的。
剛看到邀請郵件,抱歉回覆晚了,其實上面叉叉哥已經非常非常專業和準確了,但是既然被邀請,感覺不寫兩句對不起這個郵件,我就把我的一般寫法都列出來,感覺我已經進入到回字有幾種寫法的迂腐境界了。 。 。希望不要罵我:
$這個->
我用rxJava來舉例子吧,用java8的Streaming也是一樣的:
如果每個item之間要加入分隔符號的話,這次用java8的Streaming哈: