Tej*_*ale 68 java java-8 java-stream
在Java8流中,我可以修改/更新其中的对象吗?例如.List<User> users:
users.stream().forEach(u -> u.setProperty("value"))
Run Code Online (Sandbox Code Playgroud)
Psh*_*emo 80
是的,您可以修改流中的对象状态,但应避免修改流的源状态.从流包文档的非干扰部分我们可以读到:
对于大多数数据源,防止干扰意味着确保在流管道的执行期间根本不修改数据源.值得注意的例外是其源是并发集合的流,这些集合专门用于处理并发修改.并发流源是那些
Spliterator报告CONCURRENT特征的源.
所以这没关系
List<User> users = getUsers();
users.stream().forEach(u -> u.setProperty(value));
Run Code Online (Sandbox Code Playgroud)
但
users.stream().forEach(u -> users.remove(u));
Run Code Online (Sandbox Code Playgroud)
不是,可能会抛出ConcurrentModificationException像NPE这样的例外:
List<Integer> list = IntStream.range(0, 10).boxed().collect(Collectors.toList());
list.stream()
.filter(i -> i > 5)
.forEach(i -> list.remove(i)); //throws NullPointerException
Run Code Online (Sandbox Code Playgroud)
恕我直言,功能方式是:
import static java.util.stream.Collectors.toList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
public class PredicateTestRun {
public static void main(String[] args) {
List<String> lines = Arrays.asList("a", "b", "c");
System.out.println(lines); // [a, b, c]
Predicate<? super String> predicate = value -> "b".equals(value);
lines = lines.stream().filter(predicate.negate()).collect(toList());
System.out.println(lines); // [a, c]
}
}
Run Code Online (Sandbox Code Playgroud)
在这个解决方案中,原始列表没有被修改,但应该在一个新列表中包含您的预期结果,该列表可在与旧列表相同的变量下访问
| 归档时间: |
|
| 查看次数: |
85806 次 |
| 最近记录: |