首页 文章

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

提问于
浏览
3

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

  • 获取Pojos列表,其中一个字段是字符串(例如姓氏)

  • 获取要搜索的字符串(例如surnameTypedIn)

  • 在Levenshtein距离最小的列表中找到Pojo(我正在使用Apache Commons StringUtils.getLevenshteinDistance)

  • 返回整个Pojo,而不仅仅是姓氏或距离

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

1 回答

  • 9

    只需创建 Comparator<Pojo>

    Comparator<Pojo> comparator =
        Comparator.comparingInt(
            p -> StringUtils.getLevenshteinDistance(p.surname(), surnameTypedIn)
    

    然后使用 Stream.min 方法:

    Optional<Pojo> minPojo = listOfPojos.stream().min(comparator);
    

    (如果需要,可以在 Stream.min 调用中内联 Comparator.comparingInt ;为了便于阅读,我将它们分开) .

    或者,没有流:

    Pojo minPojo = Collections.min(listOfPojos, comparator);
    

    注意,如果 listOfPojos 为空,这种方式将抛出 NoSuchElementException .

相关问题