我有2个String
A = {"apple", "mango", "pineapple", "banana", ... }
B = {"app", "framework",...}
我正在寻找的是:B的任何元素至少与A的任何元素部分匹配(substring/contains/startsWith
)。例如,B'app'的第一个元素与至少一个部分匹配元素'apple'。
StackOverflow上其他紧密匹配的主题不考虑2个列表。
使用Java lambda表达解决方案有没有优雅的方法?
我觉得这是搜索域中的一般问题。所以,如果对这个主题有任何帮助或有趣的阅读,我会很高兴收到指示。
答案 0 :(得分:5)
取决于你所说的优雅,但试试这个:
List<String> r = list1
.parallelStream()
.filter( w1->{
return list2
.parallelStream()
.anyMatch( w2->w1.contains(w2) );
}
)
.collect(Collectors.toList());
anyMatch
(和filter
)可以被短路,并在找到w1.contains(w2)
的第一个匹配后中止第二个列表的流,如果找到则返回true,从而提供一些效率。使用此选项过滤第一个流。在并行流中进行。
答案 1 :(得分:2)
您可以链接两个List<String>
的流,并使用String.contains()
或您要使用的任何其他条件(substring()
,startsWith()
)进行过滤。
< / p>
然后,您可以将有效条件的一对String映射到String
数组:
List<String> listOne = Arrays.asList("apple", "mango", "pineapple", "framework");
List<String> listTwo = Arrays.asList("app", "frame");
List<String[]> values = listOne.stream()
.flatMap(x -> listTwo.stream()
.filter(y -> x.contains(y))
.map(y -> {
return new String[] { x, y };
}))
.collect(Collectors.toList());
for (String[] array : values) {
System.out.println(Arrays.toString(array));
}
输出:
[apple,app]
[菠萝,app]
[框架,框架]