Java Lambda - 查找列表的任何String元素是否与其他列表的任何元素部分匹配

时间:2017-07-29 17:49:39

标签: java lambda

我有2个String

列表
A = {"apple", "mango", "pineapple", "banana", ... }

B = {"app", "framework",...}

我正在寻找的是:B的任何元素至少与A的任何元素部分匹配(substring/contains/startsWith)。例如,B'app'的第一个元素与至少一个部分匹配元素'apple'。

StackOverflow上其他紧密匹配的主题不考虑2个列表。

使用Java lambda表达解决方案有没有优雅的方法?

我觉得这是搜索域中的一般问题。所以,如果对这个主题有任何帮助或有趣的阅读,我会很高兴收到指示。

2 个答案:

答案 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]

     

[框架,框架]