Java流和按字符串Levenshtein距离过滤

Mat*_*att 4 java java-stream

我试图找出使用Java流是否有一种优雅的方式来执行以下操作:

  1. 获取Pojos列表,其中一个字段是字符串(例如姓氏)
  2. 获取要搜索的字符串(例如surnameTypedIn)
  3. 找到Levenshtein距离最小的列表中的Pojo(我使用的是Apache Commons StringUtils.getLevenshteinDistance)
  4. 返回整个Pojo,而不仅仅是姓氏或距离

到目前为止,我能够做到的唯一方法是在每个级别创建一个中间地图,它可以工作但感觉很脏.有没有可接受的方法来实现这一点,例如通过实现自定义收集器或类似的东西?

And*_*ner 10

只需创建一个Comparator<Pojo>:

Comparator<Pojo> comparator =
    Comparator.comparingInt(
        p -> StringUtils.getLevenshteinDistance(p.surname(), surnameTypedIn)
Run Code Online (Sandbox Code Playgroud)

然后使用Stream.min方法:

Optional<Pojo> minPojo = listOfPojos.stream().min(comparator);
Run Code Online (Sandbox Code Playgroud)

(如果需要,您可以Comparator.comparingIntStream.min通话中内联;我只是将它们分开以便于阅读).

或者,没有流:

Pojo minPojo = Collections.min(listOfPojos, comparator);
Run Code Online (Sandbox Code Playgroud)

注意,这种方式会抛出一个NoSuchElementExceptionif listOfPojos为空.