我有这个下面的代码:
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
循环。
2条答案
按热度按时间mwg9r5ms1#
试试这个
输出:
如果只需要第一个匹配
输出:
nwsw7zdq2#
Java 8 -
Pattern.splitAsStream()
您可以使用正则表达式
"^\\p{Alpha}+"
在 * 非字母 * 字符上拆分String
(* 捕获一个或多个非字母字符 *)和Java 8方法Pattern.splitAsStream()
。该方法生成的元素流与String.split()
生成的元素流相同。不同之处在于Pattern.splitAsStream()
直接从regex引擎创建流,而不使用在内存中分配一个中间数组(这是一个优点)。dropWhile()
丢弃它。***请注意,**如果在另一个答案中使用 *
String.split()
,则会出现相同的问题,但该问题未得到处理。然后应用与上一个示例相同的转换,但要添加一个小的元素:我们需要处理givens字符串以空格开头的边缘情况。在这种情况下,第一个元素将是空字符串,我们可以使用来丢弃这样的字符串。
为了避免多次重新编译regex模式,存储在static final变量中是有意义的。
第一个
Java 9 -
Matcher.results()
另一个选项是使用正则表达式
"\\p{Alpha}+"
捕获 * 字母字符 * 序列,并使用Java 9方法Matcher.results()
生成MatchResult
的Stream
,它是包含有关匹配字符组的信息的对象。要从
MatchResult
中提取匹配的子字符串,我们可以使用MatchResult.group()
方法。第一次