java - 具有多个对象列表的 Java8 流
问题描述
我有两个列表,我想根据 Object1 和 Object2 的属性执行一些操作。
对象1:
public class Object1 {
private String prop1;
private String prop2;
}
对象2:
public class Object2 {
private String prop1;
private String prop2;
private String prop3;
private boolean prop4;
}
我想使用流而不是使用大方法。
假设我们有以下列表:
List<Object1> object1List = // List of Object1's
List<Object2> object2List = // List of Object2's
现在,我想比较两个列表中的 prop1 和 prop2 ,如果它们相等,我想从 Object2 中获取 prop3 并基于 prop3 现在我想从 Object2 中查看所有带有 prop4 true 的元素,并确保所有元素都带有 true 。
例子:
Object1:
prop1 | prop2
test1 value1
test1 value2
Object2:
prop1 | prop2 | prop3 | prop4
test1 value1 some true
test1 value2 some1 true
test2 value3 some true
现在从上面的示例中,我想流式传输列表并比较列表,如果 prop1 和 prop2 相等,我想在“some”的情况下获取 prop3,并使用 prop3 值获取所有 prop4 值“true” some" 并查看 prop1 和 prop2 是否在 Object 的第一个列表中,并将它们收集在一个集合中。我可以用传统方式做到这一点,但流似乎更易读,代码行更少。我只是在学习流,任何想法都值得赞赏!
解决方案
由于我无聊到想知道这个问题在问什么,这里有一个使用 Streams 实现此功能的示例。这里的关键是根据适用于流的每个元素的 Predicate 过滤/(any)Match。
主.java
import java.util.*; import java.util.stream.*;
class Main
{
public static void main(String[] args)
{
List<Object1> l1 = new ArrayList<>();//referred to as "first list" in comments
List<Object2> l2 = new ArrayList<>();//referred to as "second list" in comments
l1.add(new Object1("test1","value1"));
l1.add(new Object1("test1","value2"));
l2.add(new Object2("test1", "value1", "some", true));
l2.add(new Object2("test1", "value2", "some1", true));
l2.add(new Object2("test2", "value3", "some", true));
//This is the stream of objects2 in second list that matched both prop1 and prop2 for at least one object1 in first list
Stream<Object2> matchingProp1andProp2 = l2.stream().filter(obj2 -> l1.stream().anyMatch(obj1 -> obj1.prop1().equals(obj2.prop1()) && obj1.prop2().equals(obj2.prop2())));
matchingProp1andProp2.forEach(match -> {
//get the ones in second list that have same prop3 as the match and prop4 being true
Stream<Object2> matchingCriteria = l2.stream().filter(obj2 -> match.prop3().equals(obj2.prop3()) && obj2.prop4());
System.out.println(matchingCriteria.collect(Collectors.toList()));
});
}
}
推荐阅读
- spring-boot - 骆驼验证来自类路径的文件
- c++ - 为什么当我将字符串输入节点->名称时出现分段错误(核心转储)?
- java - 来自 openfeign 和 Observable 的 @FeignClient 导致 fastxml.jackson.databind.exc.InvalidDefinitionException
- php - 使用phpmailer发送邮件的功能不断加载没有警告
- karate - 我无法获取 JSON 对象的内部值
- javascript - 在 vue for 循环中从对象渲染
- python - 使用 Python 烧瓶将 HTML 页面与 Elasticsearch 连接
- c++ - 类通过回调提供数据
- wix - 如何使用 wix 工具集跳过 msi 的 PIDKey 要求?
- php - 如何使用准备好的语句与 excel 导入数据 n Laravel