Witam,
Chcę zmapować obiekt Candle, który składa sie z ticków (np 100 ticków) w danym interwale czasowym(np 1 min).Candle zawiera cenę otwarcia,zamkniecia, cenę maksymalną, minimalną, czas powstania świeczki oraz wolumen(ilość ticków). Chciałem zrobić to poprze @DecoratedWith i w osobnej klasie implementuje logikę.
Jednak w parametrze dałem listę ticków(od razu cały interwał). Przy kompilacji wyskakuje błąd :Can't generate mapping method from iterable type to non-iterable type.
Czy w ogóle jest możliwość zmapowania obiektu z listy obiektów w Mapstruct?
0
0
Message wychodzi a aktora akkowego
private Behavior<Command> handleTickRecord(Tick tick) {
long period = StringToPeriodMapper.fromStringToPeriodCode(request.period()).getCode();
long from = roundTime(period, tick.timestamp(), period);
tickDeque.add(tick);
if ((tickDeque.getFirst().timestamp() < from)) {
CandleMapper.INSTANCE.ticksToCandle(tickDeque.stream().toList(),request, from);
}
return this;
}
W mapperze mam sygnature:
Candle ticksToCandle(List<Tick>ticks, UserRequest request,long from);
W Dekratorze właściwa logika:
@Override
public Candle ticksToCandle(List<Tick> tick, UserRequest request, long from) {
return mapTicksToCandle(tick, request, from);
}
static Candle mapTicksToCandle(List<Tick> ticks, UserRequest request, long from) {
List<String> list = ticks.stream().map(Tick::symbol).distinct().collect(Collectors.toList());
for (String symbol : list) {
List<Tick> ticksFilteredBySymbol = CandleMapperDecorator.ticks.stream()
.filter(v -> v.symbol().equals(symbol))
.collect(Collectors.toList());
tickResults.add(ticksFilteredBySymbol);
}
for (int i = 0; i < list.size(); i++) {
int finalI = i;
candles.add(
ticks.stream()
.map(v -> new Candle(
v.provider(),
v.symbol(),
(from - StringToPeriodMapper.fromStringToPeriodCode(request.period()).getCode()),
v.bid(),
tickResults.get(finalI).stream().max(Comparator.comparing(Tick::bid))
.orElseThrow().bid(),
tickResults.get(finalI).stream().min(Comparator.comparing(Tick::bid))
.orElseThrow().bid(),
tickResults.get(finalI).stream().map(Tick::bid)
.reduce((v1, v2) -> v2).orElse(BigDecimal.ZERO),
BigDecimal.valueOf(tickResults.get(finalI).size())))
.findFirst()
.orElse(
new Candle(
"wrong", null, 0, BigDecimal.ZERO,
BigDecimal.ZERO, BigDecimal.ZERO, BigDecimal.ZERO, BigDecimal.ZERO))
);
}
return candles.get(0);
}