【问题标题】:How to remove duplicates using Java 8 streams based on criteria [duplicate]如何根据标准使用 Java 8 流删除重复项 [重复]
【发布时间】:2019-07-01 19:47:10
【问题描述】:

我有一个List 的对象,我想根据条件删除重复项:比较descr 的值,如果至少有一个row 具有Invalid 作为descr 的值,使用它对象并删除具有相同row 值的其余对象。

class Sample {
  public String row;
  public String descr;
}

示例输入数据:

[{"01", "Invalid"}, {"01", "One more"}, {"02", "Invalid"}, {"03", "another test"}]

结果应该是:

[{"01", "Invalid"}, {"02", "Invalid"}, {"03", "another test"}]

【问题讨论】:

  • 如果连续没有“Invalid”怎么办#,你会保留它们吗?你还必须使用流吗?你的示例代码也是用 Java 编写的吗?
  • 是的,保留其余部分。如果可能的话,最好使用流。是的,我正在使用 Java。
  • 我不同意这是“Java 8 Distinct by Property”的副本的说法
  • 抱歉,这个描述毫无意义:“如果至少有一个row 具有Invalid 作为descr 的值”。

标签: java java-stream


【解决方案1】:

Set

Java 中的Set 是一组没有重复的对象。

这个想法是:

  • Set 中存储对象的row 值,其中desc 等于"Invalid"
  • 在初始列表上应用removeIf() 以删除行值包含在Setdescr 不等于"Invalid" 的元素。

如:

List<Foo> foos = ...;

Set<String> invalidRows = 
foos.stream()
    .filter(f->f.getDescr().equals("Invalid"))
    .map(Foo::getRow)
    .collect(toSet());

foos.removeIf(f-> invalidRows.contains(f.getRow()) && !f.getDescr().equals("Invalid"))

【讨论】:

    猜你喜欢
    • 2016-05-16
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多