我有一些情況下,使用Java 8 Stream使我重複執行一些操作,如果沒有流,可以避免它,但我認爲問題不是與流,但我。如何做到過濾器和映射沒有重複操作的開銷
一些示例:
private class Item {
String id;
List<String> strings;
}
// This method, filters only the Items that have the strToFind, and
// then maps it to a new string, that has the id and the str found
private void doIt(List<Item> items, String strToFind) {
items.stream().filter(item -> {
return item.strings.stream().anyMatch(str -> this.operation(str, strToFind));
}).map(item -> {
return item.id + "-" + item.strings.stream()
.filter(str -> this.operation(str, strToFind)).findAny().get();
});
}
// This operation can have a lot of overhead, therefore
// it would be really bad to apply it twice
private boolean operation(String str, String strToFind) {
return str.equals(strToFind);
}
正如你所看到的,功能operation
被調用兩次爲每個項目,我不希望出現這種情況。我首先想到的是直接映射並返回「null」,如果沒有找到,然後過濾空值,但如果我這樣做,我將失去對Item的引用,因此不能使用id。
我猜是有一個更聰明的選擇,但在'map'-then-'filter'之後,就像你建議的那樣,使用'reduce'來選擇性地轉換並推送到一個新列表。 – user650881
在這種情況下,'item.strings.stream()。filter(str - > this.operation(str,strToFind))。findAny()。get()'可以被'strToFind'替換,但我猜'操作'不是那樣實際執行的? –
@JornVernee對,我把一個'equals'代表一個操作,但這可能是不同的東西。我沒有把原來的代碼,因爲是很多代碼.. –