2017-07-11 34 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編輯它,在適當的警告。 –