Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 8调用布尔方法的流和集属性_Java_Collections_Java 8_Java Stream - Fatal编程技术网

Java 8调用布尔方法的流和集属性

Java 8调用布尔方法的流和集属性,java,collections,java-8,java-stream,Java,Collections,Java 8,Java Stream,请你帮我解决这个问题,当我试图通过一个数组列表流,并调用一个基于返回布尔值的方法的setter时 作为for循环编写,它如下所示:- for (final PersonDto person : personList) { person.setUserCanEdit(userHasWriteRole(person)); } private Boolean userHasWriteRole(final PersonDto person) { return getUserRo

请你帮我解决这个问题,当我试图通过一个数组列表流,并调用一个基于返回布尔值的方法的setter时

作为for循环编写,它如下所示:-

for (final PersonDto person : personList) {
    person.setUserCanEdit(userHasWriteRole(person));
}

private Boolean userHasWriteRole(final PersonDto person) {
        return getUserRoles().contains(getReadRole());
    }
我尝试了以下几种变体,但没有成功

final List<PersonDto> results = personList.stream().filter(a -> a.setUserCanEdit(this::userHasWriteRole)).collect(Collectors.toList());

final List results=personList.stream().filter(a->a.setUserCanEdit(this::userHasWriteRole)).collect(Collectors.toList());
。。。但它抱怨说
此表达式的目标类型必须是功能接口

因为您正在更新数组列表中的对象,所以可以使用

filter()
方法是流接口的中间操作,它允许我们过滤与给定谓词匹配的流元素。无法更新筛选器中的数据。 为此使用
forEach

personList.stream().forEach(a -> a.setUserCanEdit(userHasWriteRole(a)));
若你们想进入新的arraylist,复制一份list,并在新的list上执行这些操作

List<PersonDto> copy = new ArrayList<>(personList);
copy.stream().forEach(a -> a.setUserCanEdit(userHasWriteRole(a)));
List copy=new ArrayList(personList);
copy.stream().forEach(a->a.setUserCanEdit(userHasWriteRole(a));

我想我会选择:

personList.stream()
   .filter(p -> userHasWriteRole(p))
   .forEach(p -> p.setUserCanEdit(true));

我认为这样可以保持意图清晰,

如果您想要一个包含过滤元素的列表,并对该列表中的每个元素执行
setUserCanEdit
;您可以这样做:

List newList=personList.stream()
.filter(p->userHasWriteRole(p))
.collect(Collectors.toList());
forEach(p->p.setUserCanEdit(true));

请澄清这一点
私有布尔userHasWriteRole(final PersonDto person){return getUserRoles().contains(getReadRole());}
该方法实际上并不相关,它有更多的逻辑,但出于这个问题的目的,我想显示它返回一个布尔值。我尝试了这个方法,但得到了一个“类型不匹配:无法从void转换为List“
forEach
方法是void类型@R111,那么如何实现所需的结果呢?personList将获得所需的输出,打印列表并检查@R111Thank@Deadpool。”。看起来是这样的,但是你能告诉我为什么我不能将输出分配给一个新的arraylist吗?e、 g.List newList=personList.forEach(person->person.setUserCanEdit(userHasWriteRole(person));
personList.stream()
   .filter(p -> userHasWriteRole(p))
   .forEach(p -> p.setUserCanEdit(true));