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