Неверный тип возврата в лямбду - PullRequest
0 голосов
/ 19 декабря 2018

Мне нужно написать метод, который, когда ему присваивается число, добавляет число ко всем другим элементам в массиве.Например, если значение равно 3, а вы добавляете 5, новое значение будет равно 8. Я попробовал этот метод, но получил ошибку, которую вижу впервые.Я говорю о последнем методе addValue.Код:

class IntegerList {
        private LinkedList<Integer> integers;

        public IntegerList() {
            this.integers = new LinkedList<>();
        }

        public IntegerList(Integer... numbers) {
            integers = new LinkedList<Integer>(Arrays.asList(numbers));
        }

        public boolean validateIndex(int index) {
            if(index < 0 || index > integers.size()) {
                throw new ArrayIndexOutOfBoundsException();
            }
            return true;
        }

        public void add(int el, int idx) {
            int size = integers.size();
            if(idx < integers.size()) {
                integers.add(idx, el);
            } else if(idx > integers.size()) {
                size = idx;
                el = 0;
            }
        }

        public int remove(int idx) {
            return integers.remove(idx);
        }

        public void set(int el, int idx) {
            integers.add(idx, el);
        }

        public int get(int idx) {
            return integers.get(idx);
        }

        public int size() {
            return integers.size();
        }

        public int count(int el) {
            int count = 0;
            for(int i: integers) {
                if(el == i) {
                    count++;
                }
            }
            return count;
        }

        public void removeDuplicates() {
            for(int i = 0; i < integers.size(); i++) {
                Integer integer = integers.get(i);

                for(int j = 0; j < i; j++) {
                    if(integer.equals(integers.get(i))) {
                        integers.remove(j);
                        i--;

                        break;
                    }
                }
            }
        }

        private int validateCount(int count) {
            if(count > integers.size()) {
                return integers.size();
            }

            return count;
        }

        public int sumFirst(int k) {
            k = validateCount(k);

            return integers.stream().limit(k).mapToInt(Integer::valueOf).sum();
        }

        public int sumLast(int k) {
            k = validateCount(k);

            return integers.stream().skip(integers.size() - k).mapToInt(Integer::valueOf).sum();
        }

        public void shiftRight(int index, int count) {
            validateIndex(index);
            int shiftIndex = (index + count) % integers.size();
            Integer element = integers.remove(index);
            integers.add(shiftIndex, element);
        }

        public void shiftLeft(int index, int count) {
            validateIndex(index);
            int shiftIndex = (index - count) % integers.size();
            if(shiftIndex < 0) {
                shiftIndex = integers.size() + shiftIndex;
            }
            Integer element = integers.remove(index);
            integers.add(shiftIndex, element);
        }

        public IntegerList addValue(int value) {
            return new IntegerList(
                    integers.stream()
                            .map(objectInteger -> new Integer(objectInteger + value))
                            .collect(Collectors.toCollection(LinkedList::new)));
        }
    }

Ошибка:

Bad return type in method reference: cannot convert java.util.LinkedList<E> to C

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Все в порядке с вашей лямбда-функцией, проблема в том, что вы возвращаете LinkedList<Integer>, но у вас нет конструктора для этого

Измените его следующим образом:

public IntegerList(List<Integer> numbers) {
    integers = new LinkedList<>(numbers);
}

Или вы можете изменить поток так, чтобы он возвращал массив вместо LinkedList

Integer[] integers = this.integers.stream()
            .map(objectInteger -> objectInteger + value)
            .toArray(Integer[]::new);
0 голосов
/ 19 декабря 2018

IntegerList имеет два конструктора, один из которых принимает нулевые параметры, а другой - массив;Вы пытаетесь передать его LinkedList.

Преобразовать в массив вместо сбора в список:

       return new IntegerList(
                integers.stream()
                        .map(objectInteger -> new Integer(objectInteger + value))
                        .toArray(Integer[]::new));

Как указано @ Hulk ,new Integer не требуется: вы могли бы использовать Integer.valueOf вместо этого, но если опустить любое из них, все равно будет бокс:

                        .map(objectInteger -> objectInteger + value)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...