java - 重复项不会添加到列表中

标签 java lambda java-8 java-stream

我正在尝试下面的 java 代码,并希望将所有匹配项添加到基于输入列表的列表中。下面是输入列表、查找列表和返回匹配列表。目前,当我们在输入列表中有重复值时,下面的代码会失败。有人可以建议我如何解决这个问题吗?提前致谢。

 import java.time.YearMonth;
 import java.util.*;
 import static java.util.stream.Collectors.toList;


public class PeriodTest {

public static void main(String[] args) {

    //Input
    List<YearMonth> yearMonths = Arrays.asList(YearMonth.of(2016, 9), YearMonth.of(2016, 9));

    //Look up
    List<PeriodCode> periodCodes = Arrays.asList(new PeriodCode(2016, 9), new PeriodCode(2017, 9));

    //Code
    List<PeriodCode> actualOutput = periodCodes.stream().filter(item -> yearMonths.contains(YearMonth.of(item.getYear(), item.getMonth()))).collect(toList());
    List<PeriodCode> expectedOutput = Arrays.asList
            (
                    new PeriodCode(2016, 9),
                    new PeriodCode(2016, 9)
            );

    System.out.print(actualOutput.size() == expectedOutput.size());//false 1 vs 2

}

private static class PeriodCode {

    private int year;
    private int month;

    PeriodCode(int year, int month) {
        this.year = year;
        this.month = month;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof PeriodCode)) return false;

        PeriodCode that = (PeriodCode) o;

        if (year != that.year) return false;
        return month == that.month;

    }

    @Override
    public int hashCode() {
        int result = year;
        result = 31 * result + month;
        return result;
    }

    int getYear() {
        return year;
    }

    void setYear(int year) {
        this.year = year;
    }

    int getMonth() {
        return month;
    }

    void setMonth(int month) {
        this.month = month;
    }
}

}

最佳答案

不清楚为什么您希望重复项消失,因为您实际上没有做任何事情来删除它们。

不过,将 .distinct() 添加到流链可能会有所帮助。

更新:写

periodCodes.stream()
    .flatMap(periodCode -> 
        yearMonths.stream()
            .filter(YearMonth.of(periodCode.getYear(), periodCode.getMonth())::equals)
            .map(ym -> periodCode))
    .collect(toList())

关于java - 重复项不会添加到列表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40096573/

相关文章:

c++ - 在头文件中使用 lambda 会违反 ODR 吗?

java - 安装正确的 Java 后,MacOS 上的 Oracle SQLDeveloper 无法打开

java - 使用 Java 8 时钟对类进行单元测试

java - 在请求中设置用户角色以实现基于角色的访问以保护 Jersey 中的 Web 服务

java - 为什么Java中没有无符号左移运算符

java - 如何从外部 block 开始在 lambda block 中重新抛出异常?

c# - 如何使用 lambda linq 从数据库中删除一行?

java - 在 Java 9 迁移期间未找到不兼容的类型、等式约束和方法

java - Quarkus 和 Jackson 奇怪的 Lombok 行为

java - 如何从数据库中检索图像并放置在 JSP 上?