java 如何从作为中间结果生成的字符串流中获取字符串数组?

umuewwlo  于 2022-11-20  发布在  Java
关注(0)|答案(2)|浏览(166)

我有这个下面的代码:

import java.util.HashMap;
import java.util.Map;

public class Demo {

    public static void main(String[] args) {
        Map<String,  String> map = new HashMap<>();
        map.put("colors", "Red, Green, Blue, Purple");

        map.entrySet()
           .stream()
           .filter(entrySet -> entrySet.getKey().equalsIgnoreCase("Colors"))
           .map(entrySet -> entrySet.getValue().replaceAll(" ", "").split(","));
    }
}

正如你所看到的,我在Map中寻找一个特定的条目,然后提取与该条目相关的值。该值是一个字符串(即Red, Green, Blue, Purple),我需要这些逗号分隔的颜色作为字符串数组。此外,我在拆分该字符串之前删除了所有白色。使用流,我能够从上面的代码中获得该Stream<String[]>
但最终我需要一个包含这些颜色的字符串数组,所以谁能告诉我如何从这个Stream<String[]>中收集字符串数组?
我只想使用流,没有for循环或增强的for循环。

mwg9r5ms

mwg9r5ms1#

试试这个

Map<String, String> map = new HashMap<>();

map.put("colors", "Red, Green, Blue, Purple");
map.put("numbers", "One, Two, Three");
map.put("COLORS", "Yellow, Magenta, Cyan");

String[] result = map.entrySet().stream()
    .filter(entry -> entry.getKey().equalsIgnoreCase("Colors"))
    .map(entry -> entry.getValue().replaceAll(" ", "").split(","))
    .flatMap(Stream::of)
    .toArray(String[]::new);

System.out.println(Arrays.toString(result));

输出:

[Yellow, Magenta, Cyan, Red, Green, Blue, Purple]

如果只需要第一个匹配

String[] result = map.entrySet().stream()
    .filter(entry -> entry.getKey().equalsIgnoreCase("Colors"))
    .map(entry -> entry.getValue().replaceAll(" ", "").split(","))
    .findFirst().orElse(new String[0]);

System.out.println(Arrays.toString(result));

输出:

[Yellow, Magenta, Cyan]
nwsw7zdq

nwsw7zdq2#

Java 8 -Pattern.splitAsStream()

您可以使用正则表达式"^\\p{Alpha}+"在 * 非字母 * 字符上拆分String(* 捕获一个或多个非字母字符 *)和Java 8方法Pattern.splitAsStream()。该方法生成的元素流与String.split()生成的元素流相同。不同之处在于Pattern.splitAsStream()直接从regex引擎创建流,而不使用在内存中分配一个中间数组(这是一个优点)。

  • 有一个edge-case:* 第一个元素可能是空字符串。例如,当字符串开头有一个白色时,就可能发生这种情况。由于我们不需要它出现在结果中,我们可以使用dropWhile()丢弃它。
    ***请注意,**如果在另一个答案中使用 * String.split(),则会出现相同的问题,但该问题未得到处理。

然后应用与上一个示例相同的转换,但要添加一个小的元素:我们需要处理givens字符串以空格开头的边缘情况。在这种情况下,第一个元素将是空字符串,我们可以使用来丢弃这样的字符串。
为了避免多次重新编译regex模式,存储在static final变量中是有意义的。
第一个

Java 9 -Matcher.results()

另一个选项是使用正则表达式"\\p{Alpha}+"捕获 * 字母字符 * 序列,并使用Java 9方法Matcher.results()生成MatchResultStream,它是包含有关匹配字符组的信息的对象。
要从MatchResult中提取匹配的子字符串,我们可以使用MatchResult.group()方法。
第一次

相关问题