2017-05-08 5 views
4

私は次のコードが正常に動作しているJavaの8にjava 8のremoveIfにログを追加することはできますか?

を使用しています:条件が真の場合

public void testMethod(List<String> prop1, EmailJson randomModel) { 
    prop1.stream().forEach(s -> randomModel.getSomeList() 
      .removeIf(model -> model.getSomeProp().equalsIgnoreCase(s))); 
} 

は、メッセージをログに記録することが可能ですか?

私はのようなものを探しています

:あなたはいつもこれが繰り返し発生する問題である場合は、あなたが作成することも

removeIf(model -> { 
        boolean ret = model.getSomeProp().equalsIgnoreCase(s); 
        if (ret) { 
         // add logging 
        } 
        return ret; 
        }) 
+0

「removeIf block」が実際には正しくないことを反映するように編集されました。 'removeIf'は述語を取るメソッドです。水平スクロールを避けるためにコードをラップしました。希望は大丈夫です。 –

答えて

5

removeIf(model -> model.getSomeProp().equalsIgnoreCase(s)) 

を置き換えることができます

public void testMethod(List<String> prop1, EmailJson randomModel) { 
    prop1.stream().forEach(s -> randomModel.getSomeList() 
      .removeIf(model -> model.getSomeProp().equalsIgnoreCase(s)) 
        - > if this is true then log some action); 
} 
5

述語を別のアクションで装飾するタスクを一般化するヘルパーメソッドログ:

static <T> Predicate<T> logging(Predicate<T> p, BiConsumer<T,Boolean> log, boolean all) { 
    return t -> { 
     final boolean result = p.test(t); 
     if(all || result) log.accept(t, result); 
     return result; 
    }; 
} 

あなたは、この特定のケースでは、しかし

public void testMethod(List<String> prop1, EmailJson randomModel){ 
    prop1.forEach(s -> randomModel.getSomeList() 
     .removeIf(logging(model -> model.getSomeProp().equalsIgnoreCase(s), 
      (model,b) -> LOGGER.info(() -> "matched: "+model.getSomeProp()), false))); 
} 

のように使用することができ、removeIfリターン削除する試合があったかどうかを伝えるbooleanとして、述語自体を飾るする必要があるかもしれません一致する値はまだ範囲内です。

public void testMethod(List<String> prop1, EmailJson randomModel){ 
    prop1.stream().forEach(s -> { 
     if(randomModel.getSomeList() 
         .removeIf(model -> model.getSomeProp().equalsIgnoreCase(s))) 
      LOGGER.info(() -> "there were matches of: "+s); 
    }); 
} 
関連する問題