簡體   English   中英

Java使用流和Lambda表達式代替迭代器

[英]Java Using Stream and Lambda Expressions Instead of Iterator

我有一個計算機科學課程的作業,我們的老師希望我們為迭代器使用Stream和Lambda表達式。 我沒有看到警告,而是根據自己的喜好編寫了所需的代碼,這里是:

static List<User> getUsers(String firstName){
    Iterator<User> it = users.iterator();
    ArrayList<User> tempList = new ArrayList<User>();
    while(it.hasNext()){
        User tempUser = it.next();
        if(tempUser.getFirstName().equals(firstName)){
            tempList.add(tempUser);
        }
    }
    return tempList;
}

如何將其轉換為Stream&Lambda代碼? 非常感謝您的回答。

嘗試這個

List<User> tempUsers = users.stream()
    .filter(tempUser -> tempUser.getFirstName().equals(firstName))
    .collect(Collectors.toList());
//TODO do something useful with it

您的整個方法可以簡化為一個不使用中間變量作為List的語句:

static List<User> getUsers(String firstName){
   return users.stream()                                        //iterate
               .filter(u -> u.getFirstName().equals(firstName)) //keep good ones
               .collect(Collectors.toList());                   //collect them in List
}
  • u在filter方法中是一個局部變量,它將代表users列表的每個元素,您可以根據需要命名它
  • .toCollection(ArrayList::new)將確保您擁有一個ArrayList而不是toList() ,該列表稍后可以更改,但使用它沒有問題。 無法保證返回的List的類型,可變性,可序列 toList() 或線程安全性; 如果需要對返回的List進行更多控制,請使用 doc中的toCollection(Supplier)

您可以從用戶創建流,然后執行filter操作以保留名稱等於firstName所有用戶,然后利用Collectors.toCollection將結果累加到ArrayList

List<User> tempList = users.stream()
                           .filter(e -> e.getFirstName().equals(firstName))
                           .collect(Collectors.toCollection(ArrayList::new));

暫無
暫無

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

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