Сопоставить Stream <> с экземпляром класса @value из инструмента Lombok - PullRequest
1 голос
/ 31 марта 2020

Я столкнулся с интересным вопросом из одного интервью: создание агрегатора, в котором хранятся элементы и сумма их цен, конвертированная в валюту GBR.

Поток (java .util.stream.Stream) продукта Объекты задаются следующим образом:

@Value
class Product{
   String name;
   BigDecimal price;
   String currency;
}

@ значение взято из инструмента Lombok и может генерировать toString, equals и hashCode. Он имеет геттеры для всех полей и конструктор с единичными аргументами).

Функция-агрегатор сопоставляет Stream с экземпляром ItemsAggregate, определенным следующим образом:

@value
class ItemsAggregate{
   List<Item> products;
   BigDecimal total;
}

@Value
class Item{
   String name;
   BigDecimal price;
}

Для преобразования предоставляется интерфейс Exchange 'price' для GBR использовать GBRExchange:

interface Exchange{
   Optional<BigDecimal> rate(String currency);
}

Ответ, который я могу сделать сейчас:

public class itemsAggregator implements Exchange{
    private Exchange exchange;
    itemsAggregator(GBRExchange GBRExchange){
        this.exchange = GBRExchange;
    }

    ItemsAggregate aggregate(Stream<Product> products){
        ItemsAggregate result = new ItemsAggregate();
        result.products = products.stream().filter(0->o!=null).collect(products.getName() ->Collectors.toList());
        result.total = products.stream().filter(o->o.getPrice()>=0).mapToInt(o -> o.getPrice()).sum();
        result.total = exchange.rate(result.total);
        return result;
    }
    @value
    class ItemAggregate{
        List<item> products;
        BigDecimal total;
    }

    @value
    class Item{
        String name;
        BigDecimal price;
    }
}

Объект: 1. fini sh агрегатная функция и получить Переменная GBR 'total'. 2. Обработка недопустимых значений, таких как ноль, пустые и отрицательные значения для GBRExchange, поскольку это может привести к ошибкам. 3. null, пустой Stream и т. Д., Входные данные для ItemsAggregate.aggregate () должны возвращать пустой Stream вместо null перед выполнением сопоставления.

Может кто-нибудь дать мне несколько советов, чтобы исправить это решение (поскольку я не могу отладить его), особенно в отношении пунктов 2 и 3? И я не уверен, правильно ли я отношусь к классам @Value.

Большое спасибо.

1 Ответ

0 голосов
/ 01 апреля 2020

Возможно, вы ищете что-то вроде:

    ItemsAggregate aggregate(List<Product> products) {
        List<Item> items = products.stream()
                .filter(Objects::nonNull)
                .map(p -> new Item(p.getName(),p.getPrice()))
                .collect(Collectors.toList());
        BigDecimal total = products.stream()
                .filter(o -> o.getPrice().compareTo(BigDecimal.ZERO) < 0)
                .map(p -> exchange.rate(p.getCurrency()).orElse(BigDecimal.ZERO).multiply(p.getPrice()))
                .reduce(BigDecimal.ZERO, BigDecimal::add);
        return new ItemsAggregate(items,total);
    }
...