我创建了一个返回List的函数。 我传递一个字符串“(A,1),(Y,4),(F,5)”,我想根据括号将其拆分,得到3个单独的字符串对象,如A,1,Y, 4,F,5作为列表中的3个单独对象。 我使用Java 8来创建它,但它只返回一个像A,1这样的值 功能是:
private List<String> getDataOnRegx(String str) {
Pattern filerRegx = Pattern.compile("\\(([a-zA-Z,0-9]*)\\s*\\),?");
Matcher regexMatcher = filerRegx.matcher(str);
return Stream.of(str).
filter(s -> regexMatcher.find() && regexMatcher.group(1) != null).
map(r -> new String(regexMatcher.group(1))).
collect(Collectors.toList());
}
我通过以下函数实现的预期结果,我没有使用任何Java 8功能:
private List<String> getDataOnRegx(String str) {
Pattern regex = Pattern.compile("\\(([a-zA-Z,0-9]*)\\s*\\),?");
Matcher regexMatcher = regex.matcher(str);
List<String>dataList = new ArrayList<String>();
while (regexMatcher.find()) {
if (regexMatcher.group(1) != null) {
dataList.add(regexMatcher.group(1));
}
}
System.out.println(dataList);
return dataList;
}
有人可以帮助我获取列表中的所有对象。只是想帮助纠正我已经使用Java 8编写的函数。 严格来说,我必须使用Java 8编译器。
谢谢, 阿图尔
答案 0 :(得分:4)
通过Scanner#findAll
:
String test = "(A,1),(Y,4),(F,5)";
Scanner sc = new Scanner(test);
Pattern filerRegx = Pattern.compile("\\(([a-zA-Z,0-9]*)\\s*\\),?");
List<String> results = sc.findAll(filerRegx)
.map(mr -> mr.group(1))
.filter(Objects::nonNull)
.collect(Collectors.toList());
System.out.println(results);
修改强> 我不知道该重复答案如何回答您的问题。你需要做一个非常简单的改变:
static final class MatchItr extends Spliterators.AbstractSpliterator<String> {
private final Matcher matcher;
MatchItr(Matcher m) {
super(m.regionEnd() - m.regionStart(), ORDERED | NONNULL);
matcher = m;
}
@Override
public boolean tryAdvance(Consumer<? super String> action) {
if (!matcher.find()) {
return false;
}
if (matcher.group(1) == null) {
return false;
}
action.accept(matcher.group(1));
return true;
}
}
并使用它:
MatchItr mIter = new MatchItr(regexMatcher);
StreamSupport.stream(mIter, false)
.forEach(System.out::println);