Guava——Joiner与Java8Stream(附Scala示例)

本文深入探讨了在Java中使用Guava库的Joiner类和Java 8 Stream API进行字符串拼接的多种方法。包括处理空值、自定义分隔符、Map键值对拼接及输出到不同目标如StringBuilder和文件。同时提供了Scala的对比示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 数据代码准备

  • 普通的List
List<String> list1 = Arrays.asList(
            "C", "Java", "C++", "Go", "Python", "Scala"
);
  • 包含null的List
List<String> list2 = Arrays.asList(
            "C", "Java", "C++", null, "Python", "Scala"
);
  • 普通的Map
HashMap<String, String> map = new HashMap<>();
map.put("k1", "v1");
map.put("k2", "v2");
map.put("k3", "v3");

2. Joiner和Java8Stream

2.1 普通方式

// guava
String res = Joiner.on("|").join(list1);
System.out.println("res = " + res1);

// java8 stream
String resStream = list.stream()
        .collect(Collectors.joining("|"));
System.out.println("resStream = " + resStream1);

2.2 跳过null

// guava
String res = Joiner.on("|").skipNulls().join(list2);
System.out.println("res = " + res);

// java8 stream
String resStream = list2.stream()
    	.filter(Objects::nonNull)
        .collect(Collectors.joining("|"));
System.out.println("resStream = " + resStream);

2.3 使用默认值替换null

// guava
String res = Joiner.on("|").useForNull("default").join(list2);
System.out.println("res = " + res);

// java8 stream
String resStream = list2.stream()
        .map(word -> word != null ? word : "default")
        .collect(Collectors.joining("|"));
System.out.println("resStream = " + resStream);

2.4 为Map添加分隔符

// guava
String res = Joiner.on("|").withKeyValueSeparator("->").join(map);
System.out.println("res = " + res);

// java8 stream
String resStrem = map.entrySet().stream()
 		.map(entry -> entry.getKey() + "->" + entry.getValue())
        .collect(Collectors.joining("|"));
System.out.println("resStrem = " + resStrem);

3. Joiner之append

3.1 join后,追加到StringBuilder中

StringBuilder sb = new StringBuilder("Hello World!");
StringBuilder res = Joiner.on("|").appendTo(sb, list1);
System.out.println("res = " + res);

3.2 join后,输入到File中

try(FileWriter fr = new FileWriter(new File("./test"))) {
	Joiner.on("|").appendTo(fr, list1);
} catch (IOException e) {
    e.printStackTrace();
}

4. 另附:Scala 示例

/**
  * Join测试
  *
  * @author ALion
  * @version 2019/2/2 23:01
  */
object ScalaJoinDemo {

  def main(args: Array[String]): Unit = {
    val list1 = List("C", "Java", "C++", "Go", "Python", "Scala")
    val list2 = List("C", "Java", "C++", null, "Python", "Scala")
    val map1 = Map(
      "k1" -> "v1",
      "k2" -> "v2",
      "k3" -> "v3"
    )

    val res1 = list1.mkString("|")
    println(s"res1 = $res1")

    val res2 = list2.mkString("|")
    println(s"res2 = $res2")

    val res3 = list2.filter(_ != null).mkString("|")
    println(s"res3 = $res3")

    val res4 = list2.map(e => if (e != null) e else "default").mkString("|")
    println(s"res4 = $res4")
    
    val res5 = list2.map(Option(_).getOrElse("default")).mkString("|")
    println(s"res5 = $res5")

    val res6 = map1.map(e => e._1 + "=" + e._2).mkString("|")
    println(s"res6 = $res6")
  }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值