Действительный поставщик для сбора метода потока - PullRequest
0 голосов
/ 10 января 2019

Я просто пытался создать что-то похожее на Collectors.toList(), но это не похоже на

import java.util.ArrayList;

public class ShipmentTracingDTO {

boolean destination = false;

public ShipmentTracingDTO(Boolean destination) {
    this.destination = destination;
}

public ShipmentTracingDTO() {
}

public static void main(String[] args) {
    ArrayList<ShipmentTracingDTO> tracings = new ArrayList<>();
    tracings.add(new ShipmentTracingDTO(true));
    tracings.add(new ShipmentTracingDTO(true));
    tracings.add(new ShipmentTracingDTO(false));
    tracings.add(new ShipmentTracingDTO(false));
    ArrayList<ShipmentTracingDTO> newTracings = new ArrayList<>();

// Error coming for ArrayList::new : The constructed object of type ArrayList is 
//incompatible with the descriptor's return type: R

    tracings.stream().collect(ArrayList::new, (left, right) -> left.add(right), (left, right) -> {
        left.addAll(right);
        return left;
    });
}

private boolean getDestination() {

    return destination;
}

}

Мой вопрос: если ArrayList::new здесь не работает, что будет работать. Я пробовал другой вариант, но ни один из них не работает

Ответы [ 3 ]

0 голосов
/ 10 января 2019

Просто измените это так,

tracings.stream().collect(ArrayList::new, (left, right) -> left.add(right), (left, right) -> {
    left.addAll(right);
});

Вам нужно BiConsumer НЕ BinaryOperator. То, что вы передаете выше, это BinaryOperator.

Вот пример BinaryOperator.

BinaryOperator<List<Integer>> s = (left, right) -> {
            left.addAll(right);
            return left;
};

В качестве хорошей инженерной практики всегда предпочитайте ссылки на методы лямбдам. Итак, вот расширенная версия, использующая ссылки на методы вместо лямбд.

tracings.stream().collect(ArrayList::new, List::add, List::addAll);
0 голосов
/ 10 января 2019

Я просто пытался создать что-то похожее на Collectors.toList () из мой собственный, но, похоже, он не работает

Хотя в других ответах указано, что вы сделали неправильно, стоит отметить, что если вы пытаетесь создать что-то похожее на toList(), но в то же время указываете тип возвращаемого списка, то я бы предложил использовать toCollection который специально сделан для этой цели.

tracings.stream().collect(Collectors.toCollection(ArrayList::new));

хотя это не лучше чем:

new ArrayList<>(tracings);

что короче и более читабельно.

0 голосов
/ 10 января 2019

Вы, похоже, ищете:

tracings.stream()
        .collect(ArrayList::new, 
                 ArrayList::add, 
                 ArrayList::addAll);

, что совпадает с лямбда-представлением:

tracings.stream()
        .collect(ArrayList::new, 
                 (left, right) -> left.add(right), 
                 (left, right) -> left.addAll(right)); // notice no 'return'

Причина : Stream.collect ожидает BiConsumer в качестве аргумента, который имеет метод accept с void типом возврата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...