我无法将数组流(字符串(转换为字符串流。
public static List<String> getFirstNames(List<String> names){
return names.stream()
.map(x->x.split("\s[A-Za-z]+"))
.map(elem-> new String())
.collect(Collectors.toList());
}
我在输入时有一个字符串列表,包括名字和姓氏。输出时必须有名字列表。
使用.map(x->x.split("\s[A-Za-z]+")[0])
,去掉第二个不必要的map
。您想要数组的第一个元素,它是一个String。没有理由将整个阵列传递给第二个map()
。
但如果你真的想,那么第二个映射必须是.map(arr -> arr[0])
。您不想要新的String
,它已经存在。
同样,由于这是基本语法(不是流,而是访问数组和使用字符串(,请仔细阅读此处,否则您将不断被简单的错误绊倒。
除非你有理由使用更麻烦的版本,否则在空间上拆分(split(" ")
(对你来说更可读?
如果您的列表包含类似"FirstName LastName"
的元素您可以使用substring()
方法提取名字s.substring(0, s.indexOf(" ")
试试这个:
public static List<String> getFirstNames(List<String> names){
return names.stream().map(s -> s.substring(0, s.indexOf(" "))).collect(Collectors.toList());
}
如果您的列表包含单个单词元素:
public static List<String> getFirstNames(List<String> names){
return names.stream().map(s -> s.indexOf(" ")>0 ? s.substring(0, s.indexOf(" ")) : s).collect(Collectors.toList());
}
public static List<String> getFirstNames(List<String> names){
return names.stream()
.map(x->Arrays.asList(x.split("\s[A-Za-z]+")))
.flatMap(Collection::stream)
.collect(Collectors.toList());
}
flatMap完成任务
最佳解决方案:
public static List<String> getFirstNames(List<String> names){
return names.stream()
.map(x->x.split("\s+")[0])
.collect(Collectors.toList());
}
以下是使用Arrays::stream和flatmap 的示例
List<String> firstNames =
Arrays.asList("Aman Singh","Raj Malhotra").stream()
.map(word -> word.split("\s[A-Za-z]+"))
.flatMap(Arrays::stream)
.collect(toList());
System.out.println("First names are" + firstNames);