[英]Temporary store a value using `java-stream`
我想知道是否有一種方法可以在java-stream
中臨時存儲/攜帶值?
List<Department> departments = (ArrayList<Department>) departmentRepository.findAll();
departments.parallelStream()
.filter(e -> e.getUnderstuffCount(date) > 0)
.forEach(e -> {
holidaysPlaningProblemManager.addProblem(e, date, e.getUnderstuffCount(date));
});
對e.getUnderstuffCount(date)
的多次調用接縫“臟”,我想知道是否有辦法通過攜帶單個調用的結果來避免這種情況?
編輯:
請將此視為java-stream
問題。 有很多方法可以解決此問題,例如Department
@Entity
的@Transient
字段可以存儲值,而簡單的getter
可以return
它。
但是我很感興趣是否可以使用java-stream
正如我在評論中提到的那樣,對於這樣的問題,有一個普遍的建議,就是將一個流元素映射到一個包含元素本身和所需中間值的對。 首先,讓我們找到一個更簡單的示例(也可以為我編譯):
Stream.of("Hello", "World", "!")
.filter(s -> s.length() > 1)
.forEach(s -> System.out.println(s + ": " + s.length()));
// Hello: 5
// World: 5
如果現在將簡單數組或AbstractMap.SimpleEntry
作為對對象,則可以添加一個映射步驟:
Stream.of("Hello", "World", "!")
.map(s -> new Object[] {s, s.length()})
.filter(a -> ((int) a[1]) > 1)
.forEach(a -> System.out.println(a[0] + ": " + a[1]));
Stream.of("Hello", "World", "!")
.map(s -> new AbstractMap.SimpleEntry<>(s, s.length()))
.filter(e -> e.getValue() > 1)
.forEach(e -> System.out.println(e.getKey() + ": " + e.getValue()));
數組變量的編寫要短一些,但不是類型安全的。 我會使用第二種可能性。 或者,您可以使用短方法名稱和不錯的工廠方法( Pair.of(s, s.length())
)向項目中添加實際的Pair<L, R>
類。 無論您選擇哪種方式,都比不使用收集器( stream.collect(toMap()).entrySet().stream().filter(e).forEach(e)
)收集到地圖中更好,因為您不會實現將整個地圖存儲到內存中。
我提到的另一種可能性是將支票放入forEach。 考慮到您的示例(可能是簡化的),我想說這是最容易閱讀的方式,但是當然不是“ stream-y”或“ lambda-y”。
Stream.of("Hello", "World", "!").forEach(s -> {
int length = s.length();
if (length > 1)
{
System.out.println(s + ": " + length);
}
});
在這個簡單的示例中,您甚至不需要流。 只需調用Collection.forEach()
。
最后,您必須查看在這里使用流是否值得。 您使用並行流,但是它實際上可以加快速度嗎(例如,您的holidaysPlaningProblemManager
線程安全嗎?還是只是再次同步所有線程,使並行流毫無意義)? 如果沒有,您可以將其重構為普通的for
循環或Collection.forEach
。
如果要過濾部門,我認為您應該先過濾它,然后再從數據庫中檢索它,並讓問題管理器接受列表。
List<Department> departments = departmentRepository.someMethod(date);
holidaysPlaningProblemManager.addProblems(date, departments);
除非您仍然與集合中的元素有關。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.