Java8流上的调用过滤器方法

Java8流上的调用过滤器方法,java,spring,java-8,Java,Spring,Java 8,是否可以更新流数据并直接返回?我想根据消费者发送的请求参数更新流数据,请参见下面的代码 Supplier<Stream<User>> userStream = users::stream; userStream.get().filter(user -> user.getRole().getType().getName().equalsIgnoreCase(value)); userStream.get().filter(user -> user.getDow

是否可以更新流数据并直接返回?我想根据消费者发送的请求参数更新流数据,请参见下面的代码

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

userStream.get().filter(user -> user.getRole().getType().getName().equalsIgnoreCase(value));
userStream.get().filter(user -> user.getDownloadCertificate() == check );
Supplier userStream=users::stream;
userStream.get().filter(用户->用户.getRole().getType().getName().equalsIgnoreCase(值));
userStream.get().filter(用户->用户.getDownloadCertificate()==检查);

无法更新流,因为它不是数据结构,而是支持顺序和并行聚合操作的元素序列(源:)

Java 8文档解释了流和集合之间的主要区别:

收藏虽然表面上有一些相似之处,但目标不同。集合主要涉及对其元素的有效管理和访问。相反,流不提供直接访问或操作其元素的方法,而是以声明方式描述其源以及将在该源上聚合执行的计算操作。但是,如果提供的流操作不提供所需的功能,则可以使用and操作来执行受控遍历

流管道,如上面的“小部件”示例,可以被视为流源上的查询。除非源是为并发修改而明确设计的(例如ConcurrentHashMap),否则在查询流源时修改流源可能会导致不可预测或错误的行为

资料来源:

在您的案例中,流的预期用途可能如下所示:

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());
List users=getUsers();//假设此方法返回一个用户列表
String name=“some name”;
布尔检查=真;
//现在,让我们创建一个新的筛选用户列表
List filteredUsers=users.stream()
.filter(用户->用户.getRole().getType().getName().equalsIgnoreCase(名称))
.filter(用户->用户.getDownloadCertificate()==检查)
.collect(Collectors.toList());

请记住,初始用户列表未被修改。调用终端操作(
.collect
)时,流迭代一次。

您无法更新流,因为它不是数据结构,而是支持顺序和并行聚合操作的元素序列(源:)

Java 8文档解释了流和集合之间的主要区别:

收藏虽然表面上有一些相似之处,但目标不同。集合主要涉及对其元素的有效管理和访问。相反,流不提供直接访问或操作其元素的方法,而是以声明方式描述其源以及将在该源上聚合执行的计算操作。但是,如果提供的流操作不提供所需的功能,则可以使用and操作来执行受控遍历

流管道,如上面的“小部件”示例,可以被视为流源上的查询。除非源是为并发修改而明确设计的(例如ConcurrentHashMap),否则在查询流源时修改流源可能会导致不可预测或错误的行为

资料来源:

在您的案例中,流的预期用途可能如下所示:

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());
List users=getUsers();//假设此方法返回一个用户列表
String name=“some name”;
布尔检查=真;
//现在,让我们创建一个新的筛选用户列表
List filteredUsers=users.stream()
.filter(用户->用户.getRole().getType().getName().equalsIgnoreCase(名称))
.filter(用户->用户.getDownloadCertificate()==检查)
.collect(Collectors.toList());

请记住,初始用户列表未被修改。调用终端操作(
.collect
)时,流迭代一次。

A
将迭代数据源以执行其表示的操作,但从不修改源

如果要就地修改源集合,只需直接修改,无需任何流:

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

当然,这要求
用户
是一个可变的集合。如果不是这样,您必须创建一个新集合,在这种情况下,您可以使用流API创建一个新集合,如中所示。

a
Stream
将迭代数据源以执行它所表示的操作,但决不修改源

如果要就地修改源集合,只需直接修改,无需任何流:

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

当然,这要求
用户
是一个可变的集合。如果不是这样,您必须创建一个新集合,在这种情况下,您可以使用流API创建一个新集合,如所示。

更新流数据的确切含义是什么?@JoeC我更新了这个问题,我的目的是更新“userStream”集合数据。这是不可能的。流是不可变的。更新流数据到底意味着什么?@JoeC我更新了这个问题,我的目的是更新“userStream”收集数据。这是不可能的。流是不变的。