2017-09-20 44 views
1

是否可以更新流數據並直接返回?我想更新消費者發送的請求參數流數據,請參閱下面的代碼。Java8流上的調用過濾器方法

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

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

*更新流數據*的含義是什麼? –

+0

@JoeC我已經更新了這個問題,我的意圖是更新「userStream」收集數據。 –

+3

這是不可能的。流是不可變的。 –

回答

3

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

爪哇8文檔解釋流和類別之間的主要區別在於:

類別,而軸承一些表面的相似性,有不同的目標。收藏主要關注其元素的有效管理和訪問。相比之下,流不提供直接訪問或操作元素的手段,而是關注於聲明性地描述它們的來源以及將在該來源上進行聚合的計算操作。但是,如果提供的流操作不提供所需的功能,則可以使用BaseStream.iterator()BaseStream.spliterator()操作執行受控遍歷。

流式管道,就像上面的「小部件」示例一樣,可以被視爲流源上的查詢。除非源代碼被明確設計用於併發修改(例如ConcurrentHashMap),否則在查詢流源時修改流源可能會導致不可預知或錯誤的行爲。

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

在你的情況下,物流的所需用途可以是這樣的:

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)被調用時,流迭代一次。

2

A Stream將迭代數據源以執行它所表示的操作,但從不修改源。

如果你想修改的源集合原地,只是做了直接而沒有任何流:

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

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