#stream #set
#поток #набор
Вопрос:
Я создал тесты, и теперь я борюсь с реализацией с использованием Stream. Пожалуйста, посоветуйте, как должен выглядеть поток в методах getOrdersCount() и getOrdersTotalValue()? Прямо сейчас я получаю «.collect» красным цветом в обоих методах с примечаниями об ошибках «не удается разрешить метод сбора в необязательном двойном». Почему и как это исправить?
class ShopTestSuite {
Shop shop = new Shop();
Order order1 = new Order(12.30, LocalDate.of(2020, 12, 12), "marta123");
Order order2 = new Order(67.89, LocalDate.of(2019, 1, 12), "Tomek_K");
Order order3 = new Order(123.90, LocalDate.of(2020, 2, 2), "Sylwia");
Order order4 = new Order(22.90, LocalDate.of(2020, 6, 20), "Sylwia");
@Test
public void shouldReturnOrdersCount() {
// When
Integer result = shop.getOrdersCount();
// Then
assertEquals(4, result);
}
@Test
public void shouldOrdersTotalValue() {
// When
Double result = shop.getOrdersTotalValue();
// Then
assertEquals(146.8, result);
}
@BeforeEach
public void initializeShop () {
shop.addOrder(order1);
shop.addOrder(order2);
shop.addOrder(order3);
shop.addOrder(order4);
}
Класс магазина:
public class Shop {
private Set<Order> orders = new HashSet<>();
public double getOrdersTotalValue(){
return this.orders
.stream()
.mapToDouble(Order ::getValue).sum()
.collect(Collectors.toSet()) //"cannot resolve method collect in optional double"
}
public int getOrdersCount(){
return this.orders
.stream()
.count()
.collect(Collectors.toSet()); //"cannot resolve method collect in optional double"
}
Ответ №1:
Я полагаю, вы не используете сбор (Collectors.toSet()):
public double getOrdersTotalValue(){
return this.orders
.stream()
.mapToDouble(Order ::getValue).sum();
}
public int getOrdersCount(){
return (int)this.orders
.stream()
.count();
}