Java 如何从流中转换<;数组[字符串]>;流<;字符串>;爪哇8

Java 如何从流中转换<;数组[字符串]>;流<;字符串>;爪哇8,java,string,java-stream,Java,String,Java Stream,我无法将数组流(字符串流)转换为字符串流 public static List<String> getFirstNames(List<String> names){ return names.stream() .map(x->x.split("\\s[A-Za-z]+")) .map(elem-> new String()) .collect(Col

我无法将数组流(字符串流)转换为字符串流

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());
}
publicstaticlist getFirstNames(列表名){
返回names.stream()
.map(x->x.split(\\s[A-Za-z]+))
.map(元素->新字符串())
.collect(Collectors.toList());
}
我有一个输入字符串列表,包括名字和姓氏。 输出时必须有名字列表。

使用
.map(x->x.split(\\s[A-Za-z]+”)[0])
并省略第二个不必要的
映射。您需要数组的第一个元素,它是一个字符串。没有理由将完整数组传递给第二个
map()

但是如果您真的想这样做,那么第二个映射必须是
.map(arr->arr[0])
。您不需要新的
字符串,它已经存在

另外,由于这是基本语法(当然不是流,而是访问数组和使用字符串),所以请重新整理,否则您将继续被简单的错误绊倒


在空间上拆分(
split(“”
)更容易理解,除非您有理由使用更麻烦的版本?

以下是使用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);
列出名字=
Arrays.asList(“Aman Singh”、“Raj Malhotra”).stream()
.map(word->word.split(\\s[A-Za-z]+))
.flatMap(数组::流)
.collect(toList());
System.out.println(“名字是”+名字);
公共静态列表GetFirstName(列表名称){
返回names.stream()
.map(x->Arrays.asList(x.split(\\s[A-Za-z]+))
.flatMap(集合::流)
.collect(Collectors.toList());
}
完成这项工作

最佳解决方案:

public static List<String> getFirstNames(List<String> names){
    return names.stream()
            .map(x->x.split("\\s+")[0])
            .collect(Collectors.toList());
}
publicstaticlist getFirstNames(列表名){
返回names.stream()
.map(x->x.split(“\\s+”)[0])
.collect(Collectors.toList());
}

如果您的列表包含类似“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());
}
publicstaticlist getFirstNames(列表名){
返回names.stream().map(s->s.substring(0,s.indexOf(“”)).collector(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());
}
publicstaticlist getFirstNames(列表名){
返回names.stream().map(s->s.indexOf(“”)>0?s.substring(0,s.indexOf(“”):s).collect(Collectors.toList());
}

您不想在“”上拆分以将名字与姓氏分开吗?@kenny_k哦,是的,我没有注意正则表达式。使用[0]只会从数组中返回名字,我想要使用此拆分的姓氏流(“\\s[A-Za-z]+”)。我想删除姓氏,不知道我是否认为right@DamazyKowalski没有“delete”。您可以使用
split()
根据某些文本或模式拆分字符串。然后您可以在一个数组中获取部分。使用
.split(“”)在空格上拆分
为您提供了一个大小为2的数组,名字在索引0中,姓氏在索引1中。我建议您阅读教程,当然还有教程,因为您是初学者,似乎对代码的作用仍有误解。这不会处理像regex这样的单个单词元素,但如果没有空格,则会引发异常字符串。@Kayaman,但OP说的是“输入时的字符串,包括名字和姓氏”。这完全是对问题的误解。请原样复制,注意我使用了Arrays.asList(x.split(\\s[a-Za-z]+”),所以它是Collection.stream(List)你已经使用了数组流的
flatMap
方法你的标题中提到的数组在哪里?我在你的代码或问题文本中都没有看到它。要获得最佳答案,请澄清。使用拆分方法的映射为我提供了数组流
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());
}