比方说,我有一个字符串列表,我想按过滤字符串列表进行过滤。 对于包含以下内容的列表: “ abcd”,“ xcfg”,“ dfbf”
我将精确列出过滤字符串: “ a”,“ b”以及类似filter(i-> i.contains(filterStrings)之类的东西之后,我想接收“ abcd”,“ dfbf”的列表, 对于过滤字符串的列表: “ c”,“ f”我想列出“ xcfg”和“ dfbf”的列表。
List<String> filteredStrings = filteredStrings.stream()
.filter(i -> i.contains("c") || i.contains("f")) //i want to pass a list of filters here
.collect(Collectors.toList());
还有其他方法可以代替扩展lambda表达式主体并编写带有标志的函数来检查每个过滤器吗?
答案 0 :(得分:5)
您应该在列表上执行anyMatch
来匹配:
List<String> input = Arrays.asList("abcd", "xcfg", "dfbf"); // your input list
Set<String> match = new HashSet<>(Arrays.asList("c", "f")); // to match from
List<String> filteredStrings = input.stream()
.filter(o -> match.stream().anyMatch(o::contains))
.collect(Collectors.toList());
答案 1 :(得分:2)
您可以使用简单的正则表达式来更改contains
:
.filter(i -> i.matches(".*[cf].*")) // to check just one character
或:
.filter(i -> i.matches(".*(c|f).*")) // or if you have a words
答案 2 :(得分:1)
过滤器可以表示为Predicate
。您的情况是Predicate<String>
。因此,过滤器列表可以存储在List<Predicate<String>>
中。
现在,如果要在Stream
的每个元素上应用这样的列表:
List<String> filteredStrings = input.stream()
.filter(i -> filterList.stream().anyMatch(f -> f.test(i)))
.collect(Collectors.toList());
要完成示例:
List<String> input = new ArrayList<>(Arrays.asList ("abcd", "xcfg", "dfbf","erk"));
List<Predicate<String>> filterList = new ArrayList<>();
filterList.add (i -> i.contains("c"));
filterList.add (i -> i.contains("f"));
List<String> filteredStrings = input.stream()
.filter(i -> filterList.stream().anyMatch(f -> f.test(i)))
.collect(Collectors.toList());
System.out.println (filteredStrings);
输出:
[abcd, xcfg, dfbf]
答案 3 :(得分:0)
您可以使用Pattern
:
static final Pattern pattern = Pattern.compile("c|f");
然后检查字符串是否与所述模式匹配。
List<String> strings = filteredStrings.stream()
.filter(s -> pattern.matcher(s).find())
.collect(Collectors.toList());
pattern
当然可以通过给定的输入来计算:
public static Pattern compute(String... words) {
StringBuilder pattern = new StringBuilder();
for(int i = words.length - 1; i >= 0; i++) {
pattern.append(words[i]);
if(i != 0) {
pattern.append('|');
}
}
return Pattern.compile(pattern);
}
然后可以这样称呼:
Pattern patten = compute("some", "words", "hello", "world");
这将导致正则表达式:
some|words|hello|world