簡體   English   中英

使用`java-stream`臨時存儲一個值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM