2016-10-19 4 views
0

ラムダ関数を使用してFileNameFilterを作成したいとします。JAVAのラムダ関数でループを使う方法は?

私の主な問題は、関数内にループを導入したいということです。 フィルタを使用しようとしましたが、外部リストに基づいてフィルタを作成できません。続き

は私のコードです:私は何をしたいか

File targetDir = new File(path); 
    FilenameFilter deleteFilter = new FilenameFilter() { 
     @Override 
     public boolean accept(File dir, String name) { 
      for(String tag: pageTagsList){ 
       if(name.equals(tag)) 
        return true; 
      } 
      return false; 
     } 
    }; 
    File[] foundFiles = targetDir.listFiles(deleteFilter); 

は次のようなものです:

File[] foundFiles = targetDir.listFiles(
      (dir,name)->pageTagsList.stream() 
      .filter(//code to filter here) 
      .orElse(false) 
      ); 

これを実行するための正しい方法はありますか?

+0

はたぶんこれが最もエレガントされている:あなたの望ましい結果のためには、以下のような何かを行うことができます重要な点は、ラムダ本体内で一般に反復処理する方法を知ることですが、そうでない場合は、 'Set 'の 'pageTagsSet'を使うのが最善の解決策です。 'HashSet'を参照するのは、リストを反復処理するよりも高速です。 '(dir、name) - > pageTagsList.contains(name)'はそれを行います –

答えて

6

ラムダを任意のコードブロックにすることができます(その内部から参照される変数はすべてfinalでなければなりません)。

File[] foundFiles = targetDir.listFiles((dir, name) -> pageTagsList.stream().anyMatch(name::equals)); 
2

ラムダにはコードブロックを含めることができます。構文は次のようなものです:あなたは上記のものの説明が必要な場合は、単にコメントでお願いし

(params) -> { 
    // Some code. 

    for (Element elem : elements) { 
     // Some code using elem. 
    } 

    return returnValue; 
} 
1
List<String> tags = pageTagList 
        .stream() 
        .filter(t -> t.equals(name)).collect(Collectors.toList()); 

。私はこのコードが自分自身を説明していると思う。

1
@Override 
public boolean accept(File dir, String name) {  
    return pageTagsList.stream() 
     .filter(name::equals) 
     .findAny() 
     .isPresent() 
} 
  • これは、アーロン・デイビスから真/偽、答えを返すだけのショーケースが
+2

実際、最も洗練された解決策は 'pageTagsList.contains(name)'です。 Java 2以降... – Holger

関連する問題