2017-07-11 32 views
2

我试图找出是否有做以下使用Java的一种优雅的方式流:Java流,并以字符串Levenshtein距离过滤

  1. 采取的POJO的列表,其中的一个字段是字符串(例如姓)
  2. 采取你想要搜索(如surnameTypedIn)
  3. 找到这个POJO与最小Levenshtein距离列表(我使用的Apache的百科全书StringUtils.getLevenshteinDistance)
  4. 的String返回整个Pojo,而不仅仅是姓氏或距离

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

回答

8

只需创建一个Comparator<Pojo>

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

然后使用Stream.min方法:

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

(可以内联Comparator.comparingIntStream.min通话,如果你想,我只是把他们分开了可读性) 。

,或在不流:

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

注意,这种方式将抛出一个NoSuchElementException如果listOfPojos是空的。

+0

正是我之后,谢谢!真的需要研究多一点我认为的流:) – Matt

+1

你也可以使用'Collections.min(listOfPojos,comparator);'... – Holger

+0

@Holger编辑它,在适当的警告。 –