は、フィルタエレメントが記録された後に除外されるようにStream
APIでこれ良い方法私は思ったんだけど
public static void main(String[] args) {
final List<String> dataCollection = Collections.emptyList();
final Set<String> someValues = new HashSet<>();
final Iterator<String> iterator = dataCollection.iterator();
while (iterator.hasNext()) {
final String dataItem = iterator.next();
// imagine some calculations
String calculatedData = dataItem;
if (!someValues.contains(calculatedData)) {
logger.error("Skipped data {} because of ...#1", dataItem);
iterator.remove();
continue;
}
for (char element : dataItem.toCharArray()) {
// imagine some other calculations
if (element > 100) {
logger.error("Skipped data {} because of ...#2", dataItem);
iterator.remove();
break;
}
}
}
}
のようなコードを書き換える方法があります。 peek()は、フィルタ前またはフィルタ後のすべての要素でアクションを実行するので、この場合は機能しません。
これまでのところ、ラムダの内部でロギングして設計していましたが、冗長で扱いにくく、同様の副作用があります。何らかの方法でコードをラップすることはできますが、コードを少し隠すだけです。
public static void main(String[] args) {
final List<String> dataCollection = Collections.emptyList();
final Set<String> someValues = new HashSet<>();
final Iterator<String> iterator = dataCollection.iterator();
dataCollection.stream()
.filter(byCondition1(someValues))
.filter(byCondition2())
.collect(Collectors.toList());
}
private static Predicate<String> byCondition1(Set<String> someValues) {
return dataItem -> {
final boolean remain = someValues.contains(dataItem);
if (!remain) {
logger.error("Skipped data {} because of ...#1", dataItem);
}
return remain;
};
}
private static Predicate<String> byCondition2() {
return dataItem -> {
for (char element : dataItem.toCharArray()) {
// imagine some other calculations
if (element > 100) {
logger.error("Skipped data {} because of element {}...#2", dataItem, element);
return false;
}
}
return true;
};
}
もっと良い方法があることを願っています。
*おそらく* '述語'の拡張子は? 'LoggingPredicate extends Predicate ...'と静的メソッド 'static LoggingPredicate(Logger log)'のように、 'test'メソッドをオーバーライドしてオーバーライドします。ただのアイデア... – Eugene
ええ、それは...このコードをラップする別の方法です。もちろん、それは私よりも再利用性が良い – WeGa
Stream APIは 'peek'以外のログ用に何も持っていないので、それ以外の方法はないと思います – Eugene