【问题标题】:Java Object in list doesn't get found未找到列表中的 Java 对象
【发布时间】:2021-05-23 17:38:00
【问题描述】:

我有问题。我有以下课程:

public class Cross implements Comparable<Cross> {
    
    private Long openTime;
    private String market;
    private String coin;
    private String period;
    private String metric1;
    private String metric2;
    private Double close;
    private String trend;


    public Long getOpenTime() {
        return this.openTime;
    }

    public void setOpenTime(long openTime) {
        this.openTime = openTime;
    }

    public String getMarket() {
        return this.market;
    }

    public void setMarket(String market) {
        this.market = market;
    }

    public String getCoin() {
        return this.coin;
    }

    public void setCoin(String coin) {
        this.coin = coin;
    }

    public String getPeriod() {
        return this.period;
    }

    public void setPeriod(String period) {
        this.period = period;
    }

    public String getMetric1() {
        return this.metric1;
    }

    public void setMetric1(String metric1) {
        this.metric1 = metric1;
    }

    public String getMetric2() {
        return this.metric2;
    }

    public void setMetric2(String metric2) {
        this.metric2 = metric2;
    }

    public Double getClose() {
        return this.close;
    }

    public void setClose(double close) {
        this.close = close;
    }

    public String getTrend() {
        return this.trend;
    }


    @Override
    public boolean equals(Object object) {

        if (object != null && object instanceof Cross) {
            Cross cross = (Cross) object;
            return (
                openTime.equals(cross.getOpenTime()) &&
                market.equals(cross.getMarket()) &&
                coin.equals(cross.getCoin()) &&
                period.equals(cross.getPeriod()) &&
                metric1.equals(cross.getMetric1()) &&
                metric2.equals(cross.getMetric2())
            );
        }

        return false;
    }


    @Override
    public int compareTo(Cross o) {
        return this.getOpenTime().compareTo(o.getOpenTime());
    }

}

现在我有一个包含这些元素的 500 个对象的列表。以下是显示的前 4 个:

{ openTime='1504332000000', market='USDT', coin='ETH', period='2h', metric1='EMA12', metric2='EMA26', close='363.7', trend='Down'}
{ openTime='1504663200000', market='USDT', coin='ETH', period='2h', metric1='EMA12', metric2='EMA26', close='325.73', trend='Up'}
{ openTime='1504879200000', market='USDT', coin='ETH', period='2h', metric1='EMA12', metric2='EMA26', close='294.05', trend='Down'}
{ openTime='1505181600000', market='USDT', coin='ETH', period='2h', metric1='EMA12', metric2='EMA26', close='304.41', trend='Up'}

在一个变量中,我存储了特定日期时间的纪元,并且我想找到第一个有效的交叉,所以我尝试了这个:

private Cross getValidCross(List<Cross> crossList, LocalDateTime runDateTimeGMT0) {
    long searchEpoch = runDateTimeGMT0.toEpochSecond(ZoneOffset.UTC) * 1000;
    return crossList.stream().filter(cross -> cross.getOpenTime() < searchEpoch).max(Cross::compareTo).orElse(null);
}

但是当我的searchEpoch 是例如:1514764800000 时,此代码返回值null。在列表中,我确实看到多个openTime 低于searchEpoch 的对象。我想要的结果是openTime 最高的十字架,但它仍然必须小于searchEpoch

这是我得到的错误:

runDateTimeGMT0: 2018-01-01T00:00
Exception in thread "main" java.lang.reflect.InvocationTargetException
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:64)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:564)
        at com.hatop.drivers.SimulatorDriver.run(SimulatorDriver.java:297)
        at com.hatop.drivers.HatopDriver.main(HatopDriver.java:120)
Caused by: java.lang.NullPointerException: Cannot invoke "com.hatop.models.Cross.getTrend()" because the return value of "com.hatop.drivers.HatopDriver.getValidCross(List<Cross>, LocalDateTime)" 
is null
        at com.hatop.strategies.modules.module_java001.run(module_java001.java:186)
        ... 6 more

为什么我的返回值是null

【问题讨论】:

  • crossList 是否包含在 2018 年 1 月 1 日之前使用 openTime 的十字架?
  • 是的,我在问题中打印的前 4 个十字架是 2018 年之前的。是因为我不能在 @987654337 类型上使用 &lt;=&gt; 运算符@?
  • 你的代码对我有用:online-ide.com/BiGKP7epSr

标签: java list stream


【解决方案1】:

这是由于给定参数runDateTimeGMT0 的值而导致的:

long searchEpoch = runDateTimeGMT0.toEpochSecond(ZoneOffset.UTC) * 1000;

因为这是有效的:

public class Demo {
    private static Cross getValidCross(List<Cross> crossList, LocalDateTime runDateTimeGMT0) {
        long searchEpoch = 1514764800000L;

        return crossList.stream()
                .filter(cross -> cross.getOpenTime() < searchEpoch)
                .max(Cross::compareTo)
                .orElse(null);
    }

    @SneakyThrows
    public static void main(String[] args) {
        List<Cross> crosses = Arrays.asList(
                new Cross(1504332000000L, "USDT", "ETH", "2h", "EMA12", "EMA26", 363.7, "Down"),
                new Cross(1504663200000L, "USDT", "ETH", "2h", "EMA12", "EMA26", 325.73, "Up"),
                new Cross(1504879200000L, "USDT", "ETH", "2h", "EMA12", "EMA26", 294.05, "Down"),
                new Cross(1505181600000L, "USDT", "ETH", "2h", "EMA12", "EMA26", 304.41, "Up")
        );

        Cross validCross = getValidCross(crosses, null);

        System.out.println(validCross);
    }
}

输出:

Cross(openTime=1505181600000, market=USDT, coin=ETH, period=2h, metric1=EMA12, metric2=EMA26, close=304.41, trend=Up)

顺便说一句,equals() 是在没有 hashcode() 的情况下实现的 - 问题的根源。

【讨论】:

  • 我仍然不明白如何解决我的问题。我可以用这条线做些什么不同:long searchEpoch = runDateTimeGMT0.toEpochSecond(ZoneOffset.UTC) * 1000;???
  • 这取决于openTime 是什么。是从纪元开始的秒数吗?
  • openTime 是以毫秒为单位的纪元,这就是为什么我这样做 seachEpoch * 1000
  • @A.Vreeswijk 实际上这也适用于我:Cross validCross = getValidCross(crosses, LocalDateTime.now();
  • 你得到那个结果不是很奇怪吗??? openTime 低于 searchEpoch?
【解决方案2】:

我通过在正确的Cross 构造函数中传递值来测试您的代码,因为它出现在您的列表中并且工作正常。特别是,openingTime 作为原始类型 long 传递。

问题不在过滤器中,因为您绝对可以使用Long 类型的任何运算符。

在我看来,Cross 对象的文件格式有问题。很可能是因为openingTime 字段的值,它可能被转换为错误的值。

这是我写的测试:

import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.List;

public class TestCross {
    
    

    public static void main(String[] args) {
        List<Cross> crossList = List.of(new Cross(1504332000000L,"USDT", "ETH", "2h","EMA12", "EMA26",363.7,"Down" ), 
                                        new Cross(1505181600000L,"USDT", "ETH", "2h","EMA12", "EMA26",304.41,"Up" ),
                                        new Cross(1504663200000L,"USDT", "ETH", "2h","EMA12", "EMA26",325.73,"Up" ),
                                        new Cross(1504879200000L,"USDT", "ETH", "2h","EMA12", "EMA26",294.05,"Down" ));
                                        
                                        
        Cross cross = new TestCross().getValidCross(crossList, LocalDateTime.now());
        System.out.println(cross);

    }
    
    private Cross getValidCross(List<Cross> crossList, LocalDateTime runDateTimeGMT0) {
        long searchEpoch = runDateTimeGMT0.toEpochSecond(ZoneOffset.UTC) * 1000;
        return crossList.stream().filter(cross -> cross.getOpenTime() < searchEpoch).max(Cross::compareTo).orElse(null);
    }

}

Cross

public class Cross implements Comparable<Cross> {
    
    public Cross(Long openTime, String market, String coin, String period, String metric1, String metric2, Double close,
            String trend) {
        super();
        this.openTime = openTime;
        this.market = market;
        this.coin = coin;
        this.period = period;
        this.metric1 = metric1;
        this.metric2 = metric2;
        this.close = close;
        this.trend = trend;
    }


    private Long openTime;
    private String market;
    private String coin;
    private String period;
    private String metric1;
    private String metric2;
    private Double close;
    private String trend;
    
    


    public Long getOpenTime() {
        return this.openTime;
    }

    public void setOpenTime(long openTime) {
        this.openTime = openTime;
    }

    public String getMarket() {
        return this.market;
    }

    public void setMarket(String market) {
        this.market = market;
    }

    public String getCoin() {
        return this.coin;
    }

    public void setCoin(String coin) {
        this.coin = coin;
    }

    public String getPeriod() {
        return this.period;
    }

    public void setPeriod(String period) {
        this.period = period;
    }

    public String getMetric1() {
        return this.metric1;
    }

    public void setMetric1(String metric1) {
        this.metric1 = metric1;
    }

    public String getMetric2() {
        return this.metric2;
    }

    public void setMetric2(String metric2) {
        this.metric2 = metric2;
    }

    public Double getClose() {
        return this.close;
    }

    public void setClose(double close) {
        this.close = close;
    }

    public String getTrend() {
        return this.trend;
    }


    @Override
    public boolean equals(Object object) {

        if (object != null && object instanceof Cross) {
            Cross cross = (Cross) object;
            return (
                openTime.equals(cross.getOpenTime()) &&
                market.equals(cross.getMarket()) &&
                coin.equals(cross.getCoin()) &&
                period.equals(cross.getPeriod()) &&
                metric1.equals(cross.getMetric1()) &&
                metric2.equals(cross.getMetric2())
            );
        }

        return false;
    }
    
    


    @Override
    public String toString() {
        return "Cross [openTime=" + openTime + ", market=" + market + ", coin=" + coin + ", period=" + period
                + ", metric1=" + metric1 + ", metric2=" + metric2 + ", close=" + close + ", trend=" + trend + "]";
    }

    @Override
    public int compareTo(Cross o) {
        return this.getOpenTime().compareTo(o.getOpenTime());
    }

}

这是输出:

Cross [openTime=1505181600000, market=USDT, coin=ETH, period=2h, metric1=EMA12, metric2=EMA26, close=304.41, trend=Up]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-31
    • 2016-05-13
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 2021-10-24
    • 2023-01-07
    • 1970-01-01
    相关资源
    最近更新 更多