如何从 Stream<arrays[String]> 更改为 Stream<Strings> java 8



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

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);

最新更新