Heim  >  Fragen und Antworten  >  Hauptteil

java - 如何使用lambda拼接字符串?

我现在有一个List<String> 我想使用lambda把这个list中的字符串全部循环拼接到一个字符串上,lambda可以实现么?该怎么做呢?

PHP中文网PHP中文网2741 Tage vor482

Antworte allen(5)Ich werde antworten

  • 伊谢尔伦

    伊谢尔伦2017-04-17 17:51:11

    使用foreach对StringBuilder这种有副作用,不大符合函数式编程。可以这样

    String result = list.stream().collect(Collectors.joining(""));

    Antwort
    0
  • PHP中文网

    PHP中文网2017-04-17 17:51:11

    StringBuilder str = new StringBuilder();
    list.forEach(item -> {
        str.append(item);
    });

    补充回答:为什么不能把str改成String类型,通过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可以省略),是不可以重新赋值的。

    Antwort
    0
  • 巴扎黑

    巴扎黑2017-04-17 17:51:11

    刚看到邀请邮件,抱歉回复晚了,其实上面叉叉哥已经非常非常专业和准确了,但是既然被邀请,感觉不写两句对不起这个邮件,我就把我的一般写法都列出来,感觉我已经进入到回字有几种写法的迂腐境界了。。。希望不要骂我:

        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(",")));
        }

    Antwort
    0
  • 高洛峰

    高洛峰2017-04-17 17:51:11

    $this->

    Antwort
    0
  • 迷茫

    迷茫2017-04-17 17:51:11

    我用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);

    Antwort
    0
  • StornierenAntwort