2017-07-11 17 views
2

レーベンシュタイン文字列でフィルタストリーム:のJavaストリームとの距離

  1. は、フィールドのいずれかがあるのPOJOのリストを取ります文字列(例えば姓)
  2. 検索したい文字列(例えばsurnameTypedIn)を取る
  3. (Iは、Apache CommonsのStringUtils.getLevenshteinDistanceを使用しています)最小のレーベンシュタイン距離でリストにPOJOを見つけます姓や距離だけでなく、Pojo全体を返す

これまでのところ私ができることは、各レベルで中間のマップを作成することですが、動作するが非常に汚いと感じる。これを行うための受け入れられた方法がありますか?たとえば、カスタムコレクタなどを実装しますか?

答えて

8

だけ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をインライン化することができ、私は読みやすさのためにそれらを分離) 。

あるいは、ストリームなし:listOfPojosが空の場合、この方法はNoSuchElementExceptionをスローすることを

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

注意。

+0

私は後で何をしたのですか、ありがとう! – Matt

+1

'Collections.min(listOfPojos、comparator);' ... – Holger

+0

@Holgerを適切な注意書きで編集して使用することもできます。 –