簡體   English   中英

如何使用流和 lambda 表達式重寫此方法?

[英]How can I rewrite this method using streams and lambda expressions?

我這里有這段代碼基本上只是創建了一些等於參數的線程,在每個線程中實例化一個 MyRunnable object,將線程添加到線程列表,然后根據迭代設置線程的名稱循環。

public class ThreadManager {
    protected List<Thread> threads;

    public void createThreads(int number) {
        
        for (int i = 0; i < number; i++) {
            Thread thread = new Thread(MyRunnable::new);
            threads.add(thread);
            thread.setName("thread"+i);
        }
    }
}

我的問題是是否有更清潔的方法來做到這一點? 是否可以使用流將此功能封裝在 lambda 中?

Lambda 在可變局部變量、控制流和檢查異常方面是不透明的。

那真的很糟糕……如果保證 lambda 表達式“在您使用它們時”運行。 如果您將 lambda 傳遞給其他線程或上下文以在完全不同的時間運行,那就太好了。 這解釋了為什么lambda 在這 3 個方面不透明:如果 lambda 在它們被設計為能夠執行的上下文之外運行,那就太棒了。

因此,當你使用它們的工作保證在上下文中運行時,lambdas 很糟糕。 有時它們是較小的邪惡,在這種情況下仍然值得運行它們,但是,所有其他條件都相同嗎? Lambda 壞了。

那么,為什么您可能會對將這個極其簡單的代碼編寫為 lambda 感興趣? 你只會讓事情變得更糟。

但是,如果你想忽略所有這些,將你的工具箱縮減為一個錘子(lambdas/stream API),然后將它用於所有事情,即使錘子並不是真正設計用於:

threads = IntStream.of(0, number)
  .mapToObj(i -> new Thread(new MyRunnable(), "thread" + i))
  .toList();

請注意,您編寫MyRunnable::new不是您想要的。

MyRunnable::new構造了一個全新的class (不是你的MyRunnable!),它實現了 Runnable 並且其run()方法執行以下操作:

  • 創建 MyRunnable 的新實例。
  • 把它扔進垃圾桶。
  • 返回。

我很懷疑你想要那個。 只是new MyRunnable()將..創建一個新的 myrunnable。 哪個是你想要的,不是嗎?

我只是這樣做:

for (int i = 0; i < number; i++) {
  list.add(new Thread(new MyRunnable(), "thread" + i));
}

更短,更容易理解,對未來的變化更靈活(例如:如果你改變了一些東西並且你從那里拋出一些檢查過的異常,那沒問題。而對於 lambda 表格你必須把它扔進垃圾箱並且重新開始。甚至:除了創建新線程 object 之外,您還想記錄一些內容 - 在 lambda 版本中,您需要添加大括號,通常 go 到結構上的城鎮。而對於第二個片段,只需...添加日志語句。根本不需要其他更改)。

你可以這樣做:

public class ThreadManager {

  protected List<Thread> threads;

  public void createThreads(int number) {
    IntStream.range(0, number).forEach(i -> threads.add(new Thread(MyRunnable::new, "thread" + i)));
  }
}

IntStream.range()創建 stream,其行為類似於您的循環。 引用 - Returns a sequential ordered IntStream from startInclusive (inclusive) to endExclusive (exclusive) by an incremental step of 1. .. 代碼當然更短,但我非常懷疑它會更干凈。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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