84669 orang belajar
152542 orang belajar
20005 orang belajar
5487 orang belajar
7821 orang belajar
359900 orang belajar
3350 orang belajar
180660 orang belajar
48569 orang belajar
18603 orang belajar
40936 orang belajar
1549 orang belajar
1183 orang belajar
32909 orang belajar
我现在有一个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(","))); }
$this->
我用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可以省略),是不可以重新赋值的。
刚看到邀请邮件,抱歉回复晚了,其实上面叉叉哥已经非常非常专业和准确了,但是既然被邀请,感觉不写两句对不起这个邮件,我就把我的一般写法都列出来,感觉我已经进入到回字有几种写法的迂腐境界了。。。希望不要骂我:
$this->
我用rxJava来举例子吧,用java8的Streaming也是一样的:
如果每个item之间要加入分隔符的话,这次用java8的Streaming哈: