Как решить проблему «не удается разрешить сбор метода в необязательном двойном»?

#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();
}