如何用Java 8无循环拆分姓名:提取名、中间名与姓氏
问题描述
现有字符串:
String name = "Chris Mike Soloman Miller Cooper";
需求:将该字符串拆分为firstname(第一个单词)、lastname(最后一个单词)、middlename(剩余所有单词),要求不使用for循环,能否通过Java 8特性实现?
预期结果:firstname = Chris, lastname = Cooper, middlename = Mike Soloman Miller
目前已尝试的代码(希望替换掉其中的for循环):
String name = "Chris Mike Soloman Miller Cooper"; String [] fullName = name.split(" "); String firstName = fullName[0]; String lastName = fullName[fullName.length-1]; StringBuilder middleName = new StringBuilder(); for(int i=1; i<fullName.length-1; i++) { middleName.append(fullName[i]); middleName.append(" "); } String middleName = String.valueOf(middleName.toString().trim());
解决方案
当然可以用Java 8特性实现,这里提供两种简洁的方案:
方案1:Java 8 Stream API
利用Stream的skip和limit方法筛选中间元素,再通过Collectors.joining完成拼接,完全替代for循环:
import java.util.Arrays; import java.util.stream.Collectors; public class NameSplit { public static void main(String[] args) { String name = "Chris Mike Soloman Miller Cooper"; String[] fullName = name.split(" "); String firstName = fullName[0]; String lastName = fullName[fullName.length - 1]; // 跳过第一个元素,取到倒数第二个元素之前的所有内容,用空格拼接 String middleName = Arrays.stream(fullName) .skip(1) .limit(fullName.length - 2) .collect(Collectors.joining(" ")); System.out.printf("firstname = %s, lastname = %s, middlename = %s%n", firstName, lastName, middleName); } }
方案2:正则表达式(更简洁,无需拆分数组)
通过正则分组直接提取三个部分,一步到位,甚至不需要拆分字符串数组:
import java.util.regex.Matcher; import java.util.regex.Pattern; public class NameSplitRegex { public static void main(String[] args) { String name = "Chris Mike Soloman Miller Cooper"; // 正则分组:第一个单词 -> 中间所有内容 -> 最后一个单词 Pattern pattern = Pattern.compile("^(\\w+)\\s+(.*)\\s+(\\w+)$"); Matcher matcher = pattern.matcher(name); if (matcher.find()) { String firstName = matcher.group(1); String middleName = matcher.group(2); String lastName = matcher.group(3); System.out.printf("firstname = %s, lastname = %s, middlename = %s%n", firstName, lastName, middleName); } } }
内容的提问来源于stack exchange,提问作者user21413761
相关产品推荐
相关产品推荐

