gpt4 book ai didi

java - 如何在 Java Streams 中记录过滤后的值

转载 作者:太空狗 更新时间:2023-10-29 23:01:45 25 4
gpt4 key购买 nike

我需要 log/sysout Java Streams 中的过滤值。我能够使用 peek() 方法log/sysout 未过滤的值。但是,有人可以让我知道如何记录过滤后的值吗?

例如,假设我有一个 Person 对象列表,如下所示:

List<Person> persons = Arrays.asList(new Person("John"), new Person("Paul"));

我想过滤掉那些不是“John”的人,如下:

persons.stream().filter(p -> !"John".equals(p.getName())).collect(Collectors.toList());

但是,我必须记录被过滤的那个“约翰”人的详细信息。有人可以帮我实现这个目标吗?

最佳答案

如果要将其与 Stream API 集成,除了手动引入日志记录之外,您无能为力。最安全的方法是在 filter() 方法本身中引入日志记录:

List<Person> filtered = persons.stream()
.filter(p -> {
if (!"John".equals(p.getName())) {
return true;
} else {
System.out.println(p.getName());
return false;
}})
.collect(Collectors.toList());

请记住,向 Stream API 引入副作用是不正当的,您需要清楚自己在做什么。


您还可以构造一个通用的包装器解决方案:

private static <T> Predicate<T> andLogFilteredOutValues(Predicate<T> predicate) {
return value -> {
if (predicate.test(value)) {
return true;
} else {
System.out.println(value);
return false;
}
};
}

然后简单地:

List<Person> persons = Arrays.asList(new Person("John"), new Person("Paul"));

List<Person> filtered = persons.stream()
.filter(andLogFilteredOutValues(p -> !"John".equals(p.getName())))
.collect(Collectors.toList());

...甚至可以自定义操作:

private static <T> Predicate<T> andLogFilteredOutValues(Predicate<T> predicate, Consumer<T> action) {
Objects.requireNonNull(predicate);
Objects.requireNonNull(action);

return value -> {
if (predicate.test(value)) {
return true;
} else {
action.accept(value);
return false;
}
};
}

然后:

List<Person> filtered = persons.stream()
.filter(andLogFilteredOutValues(p -> !"John".equals(p.getName()), System.out::println))
.collect(Collectors.toList());

关于java - 如何在 Java Streams 中记录过滤后的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50501366/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com