java 8中的字符串连接实现

x33g5p2x  于2022-10-13 转载在 Java  
字(4.1k)|赞(0)|评价(0)|浏览(850)

几乎每种编程语言本身都支持字符串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>

使用StringJoiner或String.join

java8中连接字符串的两种新方法是使用String.joinStringJoiner。让我们示例化一个StringJoiner类,并使用空格作为分隔符或放置在每个字符串之间的值。添加一些随机字符串“LevelUp”、“Lunch”和“Tutorial”,我们可以调用toStringStringJoiner转换为字符串。使用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);
}

在Instream中连接int

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

接下来,虽然我不建议构建自己的CSV连接程序,但您可以获取字符串列表并生成逗号分隔的字符串。有许多开源java库,如open csvcommons 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);

}

连接Map元素以生成json

同样,不推荐使用这种方法生成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上找到

相关文章