几乎每种编程语言本身都支持字符串join()函数。在本教程中,您将了解到java8如何最终添加了对连接字符串的支持。
[0:16]
从maven archetype quick start生成java项目,我们将更新项目以使用java8并添加junit的依赖项。
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
java8中连接字符串的两种新方法是使用String.join
或StringJoiner
。让我们示例化一个StringJoiner
类,并使用空格作为分隔符或放置在每个字符串之间的值。添加一些随机字符串“LevelUp”、“Lunch”和“Tutorial”,我们可以调用toString
将StringJoiner
转换为字符串。使用junit 4断言语句验证预期结果。String.join
在某种意义上是一个缩写调用,但如果你看下面的内容,它会委托给StringJoiner
。让我们使用相同的分隔符和值来连接。
让我们运行测试来验证结果。
@Test
public void basic_string_join() {
StringJoiner stringJoiner = new StringJoiner(" ");
String concatenatedString = stringJoiner.add("LevelUp").add("Lunch")
.add("Tutorial").toString();
assertEquals("LevelUp Lunch Tutorial", concatenatedString);
String stringJoined = String.join(" ", "LevelUp", "Lunch", "Tutorial");
assertEquals("LevelUp Lunch Tutorial", stringJoined);
}
java8中添加的另一个类是IntStream,它是用于处理原始int的专用流。在这个例子中,我们想将IntStream
转换成一个字符串,我们可以使用一个专门的收集器Collectors.joining()
将所有值连接在一起。这个收集器在封面下面使用一个StringJoiner
连接流的输入元素,并用逗号分隔每个值,并附加一个前缀和后缀括号。该技术也可用于IntStream
或姐妹流LongStream或DoubleStream。
让我们运行我们的示例并验证测试是否成功。
@Test
public void join_intstream_values(){
String intStreamToString = IntStream.of(1, 2, 3, 4)
.boxed()
.map(String::valueOf)
.collect(Collectors.joining(",", "[", "]"));
assertEquals("[1,2,3,4]", intStreamToString);
}
接下来,虽然我不建议构建自己的CSV连接程序,但您可以获取字符串列表并生成逗号分隔的字符串。有许多开源java库,如open csv或commons csv,更适合csv解析。在第一段代码中,让我们使用String.join
作为分隔符,使用“hello”、“world”和“csv”作为元素,然后编写单元测试来验证我们的结果。第二段代码我们将创建一个具有相同值的列表,然后使用Collectors.joining
收集或连接arraylist中的所有字符串。
让我们运行测试进行验证。
@Test
public void join_string_csv() {
String stringToCSV = String.join(",", "hello", "world", "csv");
assertEquals("hello,world,csv", stringToCSV);
List<String> randomStrings = new ArrayList();
randomStrings.add("hello");
randomStrings.add("world");
randomStrings.add("csv");
String listToCSV = randomStrings.stream().collect(
Collectors.joining(","));
assertEquals("hello,world,csv", stringToCSV);
}
在我们的下一个片段中,我们创建了一个Team
类,并模拟了一些与NCAA tournament相关的数据。通常,当您有一个对象列表时,您可能需要跨对象拉字段来生成字符串。在这段代码中,我们希望加入所有球队的名字,并用破折号分隔。
调用stream.map
并传入Team::getName
方法引用将映射每个Team
名称。你可以把它看作是在for-each循环上循环调用team.getName
或写出for (Team team : teams) {team.getName();}
。接下来使用Collectors.joining("-")
传入将用破折号连接每个元素。在29号屏幕广播之后,打印流,我们可以使用foreach循环打印流的元素。
同样,让我们运行单元测试来验证结果。
class Team {
String name;
String state;
public Team(String name, String state) {
super();
this.name = name;
this.state = state;
}
public String getName() {
return name;
}
}
@Test
public void join_list_objects_values() {
List<Team> teams = new ArrayList<>();
teams.add(new Team("Badgers", "Wisconsin"));
teams.add(new Team("Bearcats", "Ohio"));
teams.add(new Team("Terrapins", "Maryland"));
String allTeams = teams.stream().map(Team::getName)
.collect(Collectors.joining("-"));
assertEquals("Badgers-Bearcats-Terrapins", allTeams);
}
同样,不推荐使用这种方法生成json,但这段代码向您展示了StringJoiner
前缀和后缀的强大功能。注意:此json的输出无效。一个更合适的解决方案是使用jsonarray使用jackson或gson fromjson list将对象转换为json。
用一些种子数据创建一个HashMap
,我们可以调用entrySet().stream()
和.map(Object::toString)
对每个值调用toString方法,这将返回“key=value”。然后,我们可以使用Collectors.joining
来收集每个值,它将逗号指定为分隔符,结果的前缀和后缀包含“{}”。
让我们运行测试来验证结果。
@Test
public void map_values_to_json() {
Map<String, String> mapToJson = new HashMap<String, String>();
mapToJson.put("name", "Justin");
mapToJson.put("city", "Janesville");
mapToJson.put("ncaa-team", "UW badgers");
String json = mapToJson.entrySet().stream()
.map(Object::toString)
.collect(Collectors.joining(",", "{", "}"));
assertEquals("{city=Janesville,name=Justin,ncaa-team=UW badgers}", json);
}
尽管java8取得了进步,使开发人员更容易连接字符串,但我认为它还没有guava joiner那么灵活、强大和流畅。
感谢您加入今天的升级,祝您度过美好的一天!
此页面上的所有代码都可以在github:View the source上找到
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : http://www.leveluplunch.com/java/tutorials/031-join-strings-java8/
内容来源于网络,如有侵权,请联系作者删除!