Imp*_*uck 0 java list java-8 java-stream
有没有办法使用一些谓词和java流过滤内部和外部列表?例如:
Class outerObject{
int num;
List<innerObject> innerObjectList;
}
Class innerObject{
int num;
}
List <outerObject> outerObjectList
Run Code Online (Sandbox Code Playgroud)
有没有办法过滤列表,使outerObject列表有字段num = 10,相应字段的innerObject's 列表outerObject也被相应的字段过滤num = 10?
我试过了:
outerObjectList.stream()
.filter(i -> i.getNum() == 10)
.filter(i -> i.getOrders().stream().anyMatch(s -> getNum() == 10))
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
但它似乎没有过滤内部列表.
描述性示例:
如果外部列表中有3个对象,num = 10并且3个对象中的每个对象都有1个内部对象innerObjectList,num = 10那么它应该给我一个3 outerObject的列表,innerObject每个列表为1 .
它不会过滤内部列表,因为你决不会改变任何元素; 你只是从顶级列表中删除它们.
要过滤内部列表,您应该有一个对outerObjects进行操作的.map操作,将它们更改为新的outerObjects,其innerObjectLists本身是旧的.
outerObjectList.stream()
.filter(i -> i.getNum() == 10)
.filter(i -> i.getOrders().stream().anyMatch(s -> getNum() == 10))
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
让我们打破这一点:你有两个流,一个外流(在其上调用.filter,.filter并.collect和内流,在其上调用.anyMatch,那你最终全部是外流的集合,并在不你修改它的任何成员(只有流本身的结构,通过删除它们.)你根本不修改内部流;你只是报告它的一个特征("它有什么用getNum() == 10?" )
如果要过滤内部流,则还有更多工作要做.您实际上可以修改外部流的元素.peek,将其列表更改为"已过滤"版本; 或者,如果你想成为好的和不可变的,你可以创建新的过滤版本.map.
对于该.map()方法,您需要有一个lambda来创建一个新的OuterObject,以便:
output.num == input.numoutput.innerObjectList == input.innerObjectList.stream().filter(s -> s.getNum() == 10)这有意义吗?