无法在一个流中生成>foreach->集合?

2022-09-01 04:16:53

我想实现这样的东西:

items.stream()
    .filter(s-> s.contains("B"))
    .forEach(s-> s.setState("ok"))
.collect(Collectors.toList());

filter,然后从筛选结果中更改属性,然后将结果收集到列表中。但是,调试器说:

无法在基元类型 上调用。collect(Collectors.toList())void

我需要2个流吗?


答案 1

forEach被设计为终端操作,是的 - 调用它后您不能做任何事情。

惯用的方法是首先应用转换,然后将所有内容应用于所需的数据结构。collect()

可以使用专为非突变操作设计的方法来执行转换。map

如果您正在执行非变异操作:

 items.stream()
   .filter(s -> s.contains("B"))
   .map(s -> s.withState("ok"))
   .collect(Collectors.toList());

where 是返回原始对象的副本(包括提供的更改)的方法。withState


如果您正在执行副作用:

items.stream()
  .filter(s -> s.contains("B"))
  .collect(Collectors.toList());

items.forEach(s -> s.setState("ok"))

答案 2

替换为 。forEachmap

 items.stream()
      .filter(s-> s.contains("B"))
      .map(s-> {s.setState("ok");return s;})
      .collect(Collectors.toList());

forEach并且都是终端操作 - 流必须只有一个。任何返回 a 的东西都是 a,任何其他的东西都是 。collectStream<T>intermediate operationterminal operation


推荐