提问人:Shahbaz Khan 提问时间:8/4/2018 最后编辑:Stefan ZobelShahbaz Khan 更新时间:8/6/2018 访问量:3548
使用 java 8 Streams 从 DTO 中的数组列表中删除元素
Removing element from an array list within a DTO using java 8 Streams
问:
我有 DTO,它包含几个属性,其类型为 。ArrayList
- 我想把这个 DTO 作为参数。
- 然后获取带有 的属性。
ArrayList
- 然后基于一些谓词,我想从
ArrayList
最后返回修改后的 DTO
public class SomeDTO{ private String attrOne; private String attrTwo; private List<SomeOtherDataType> listAttr; // getters // setter ... } // This is the method where I want to modify the DTO private void modifyDTO(SomeDTO someDTO){ someDTO.getlistAttr() .stream() /// need help here, how to remove some element from list /// based on some condition. /// note the changes in the list should be reflected in DTO }
这可以通过简单地执行 forEach 终端操作来完成,但是是否有更好的方法可以做到这一点或其他人遵循的任何最佳实践。
谢谢
答:
这里没有必要使用流。只需使用 Collection.removeIf。
来自 javadoc(强调我的)
删除此集合中满足给定谓词的所有元素。迭代期间或谓词引发的错误或运行时异常将中继给调用方。
因此,您可以编写
someDTO.getlistAttr().removeIf((someOtherDataType) -> /*Your logic here*/)
如果你真的想使用流,那么从你离开的地方,你可以使用一个,并将传递过滤器的元素收集为一个列表。filter
SomeOtherDataType
List<SomeOtherDataType> filterdList = someDTO.getlistAttr()
.stream()
.filter(someOtherDataType -> /* your logic */)
.collect(Collectors.toList())
但是在此之后,您要么必须
使用上述 ()1 或
SomeDTO
filterdList
new SomeDTO(someDTO.getAttrOne(), someDTO.getAttrTwo(), filterdList)
将现有的
listAttr
filterdList
(someDTO.setListAttr(filterdList)
)
1 我想你的意思是第二个实例变量的名称是 。attrTwo
事实上,你有两种方法:
收集包含要保留的元素的新列表并将其分配给字段
从实际列表中删除元素
第二种方式可能是您需要的,原因有很多,例如:
通常,对于字段,您不希望创建新列表来更改其状态。您只想对引用不可变对象的字段执行此操作。
List
如果某些对象在字段上保留引用,则这些对象将引用旧对象。这是不可取的,并且会产生难以理解的副作用问题。
List
创建整个过滤对象可能会在 CPU/内存方面产生成本,而从现有对象中删除对象可能更有效。
List
1 路)重新分配给新对象
List<SomeOtherDataType> listAttr =
someDTO.getlistAttr()
.stream()
.filter(o -> conditionToKeep)
.collect(Collectors.toList());
someDTO.setListAttr(listAttr);
2 way) 在当前对象中过滤
someDTO.getlistAttr().removeIf(o -> conditionToRemove);
编辑关于 OP 注释
即使过滤掉元素的条件需要挖掘对象和组成它的元素,流仍然不是必需的。
一个花哨的代码来说明:SomeOtherDataType
someDTO.getlistAttr()
.removeIf(o -> {
Bar bar = o.getFoo().getBar();
if (bar != null){
List<FooBar> fooBars = bar.getList();
if (fooBars.contains(...)){
return true; // I remove in this case
}
}
return false; // in any other case I keep
}
);
评论
下一个:如何定义可变组?
评论