gpt4 book ai didi

java - 使用 java 8 Streams 从 DTO 中的数组列表中删除元素

转载 作者:行者123 更新时间:2023-11-29 07:26:28 32 4
gpt4 key购买 nike

我有一个 DTO,它包含几个 ArrayList 类型的属性。

  1. 我想将此 DTO 作为参数。
  2. 然后用ArrayList获取属性。
  3. 然后基于一些谓词,我想从 ArrayList
  4. 中删除一些元素
  5. 最后返回修改后的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 终端操作来完成,但是是否有更好的方法或其他人遵循的任何最佳实践。

谢谢

最佳答案

事实上你有两种方式:

  • 收集一个包含要保留的元素的新列表并将其分配给该字段

  • 从实际列表中删除元素

第二种方式可能是您出于多种原因需要的方式,例如:

  • 通常对于 List 字段,您不想创建新的 List 来更改其状态。您只想对引用不可变对象(immutable对象)的字段这样做。

  • 如果某些对象保留对 List 字段的引用,则这些对象将引用旧对象。这是不可取的,并且会产生难以理解的副作用问题。

  • 创建整个筛选对象可能会在 CPU/内存方面产生成本,而从现有 List 中删除对象可能效率更高。

一种方式)重新分配给一个新对象

 List<SomeOtherDataType> listAttr =
someDTO.getlistAttr()
.stream()
.filter(o -> conditionToKeep)
.collect(Collectors.toList());
someDTO.setListAttr(listAttr);

2 种方式)在当前对象中过滤

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
}
);

关于java - 使用 java 8 Streams 从 DTO 中的数组列表中删除元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51683097/

32 4 0