簡體   English   中英

Java8 Stream上的Call Filter方法

[英]Call Filter method on Java8 Stream

是否可以更新Stream數據並直接將其返回? 我想根據消費者發送的請求參數更新流數據,請參見下面的代碼。

Supplier<Stream<User>> userStream = users::stream;

userStream.get().filter(user -> user.getRole().getType().getName().equalsIgnoreCase(value));
userStream.get().filter(user -> user.getDownloadCertificate() == check );

您不能更新Stream,因為它不是數據結構,而是支持順序和並行聚合操作的一系列元素 (來源: https//docs.oracle.com/javase/8/docs/api/?java / util /stream/Stream.html )。

Java 8文檔解釋了Streams和Collections之間的主要區別:

集合雖然具有一些表面上的相似性,但具有不同的目標。 館藏主要涉及對其元素的有效管理和訪問。 相比之下,流不提供直接訪問或操縱其元素的方法,而與聲明性地描述其源以及將在該源上聚合執行的計算操作有關。 但是,如果提供的流操作未提供所需的功能,則可以使用BaseStream.iterator()BaseStream.spliterator()操作執行受控的遍歷。

像上面的“窗口小部件”示例一樣,流管道也可以視為對流源的查詢。 除非明確為並行修改而設計了源(例如ConcurrentHashMap),否則在查詢流源時修改流源可能會導致不可預測或錯誤的行為。

來源: https : //docs.oracle.com/javase/8/docs/api/? java/ util/ stream/ Stream.html

在您的情況下,Stream的期望用法可能如下所示:

List<User> users = getUsers(); // let's assume this method returns a list of users
String name = "some name";
boolean check = true;

//Now let's create a new list of filtered users
List<User> filteredUsers = users.stream()
        .filter(user -> user.getRole().getType().getName().equalsIgnoreCase(name))
        .filter(user -> user.getDownloadCertificate() == check)
        .collect(Collectors.toList());

請記住,初始用戶列表未修改。 調用終端操作( .collect )時,流將迭代一次。

Stream將在數據源上進行迭代以執行其表示的操作 ,但永遠不要修改該源。

如果要就地修改源集合,則無需任何流即可直接進行:

users.removeIf(user -> !user.getRole().getType().getName().equalsIgnoreCase(value));
users.removeIf(user -> user.getDownloadCertificate() != check );

當然,這要求users是可變的集合。 如果不是這種情況,則無論如何都必須創建一個新集合,在這種情況下,您可以使用Stream API創建一個新集合, 如此答案所示。

暫無
暫無

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

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