метод сбора (коллекционер) в типе Stream <Dish>не применимо для аргументов (Collector) - PullRequest
0 голосов
/ 09 октября 2018

Я получаю приведенную ниже ошибку для кода Java 8, разработанного ниже.В этом примере мы пытаемся объединить все имена Блюда в одну переменную.С кодом ниже я получил это "The method collect(Collector<? super Dish,A,R>) in the type Stream<Dish> is not applicable for the arguments (Collector<CharSequence,capture#3-of ?,String>)".

Dish.java

@Builder
@Data
@AllArgsConstructor
public class Dish {
    public enum Type { MEAT, FISH, OTHER }

    private final String name;
    private final boolean vegetarian;
    private final int calories;
    private final Type type;

    public static final List<Dish> menu =
            Arrays.asList( new Dish("pork", false, 800, Dish.Type.MEAT),
                           new Dish("beef", false, 700, Dish.Type.MEAT),
                           new Dish("chicken", false, 400, Dish.Type.MEAT),
                           new Dish("french fries", true, 530, Dish.Type.OTHER),
                           new Dish("rice", true, 350, Dish.Type.OTHER),
                           new Dish("season fruit", true, 120, Dish.Type.OTHER),
                           new Dish("pizza", true, 550, Dish.Type.OTHER),
                           new Dish("prawns", false, 400, Dish.Type.FISH),
                           new Dish("salmon", false, 450, Dish.Type.FISH));
}

Вот основной метод

String shortMenu = Dish.menu.stream().map(Dish::getName).collect(joining());
System.out.println(shortMenu);

String shortMenu1 = Dish.menu.stream().collect(joining()); //line-3

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

У вас есть аннотация Lombok @Data, которая автоматически создает метод toString(), так что, вероятно, вы ожидаете, что строка 3 будет работать.Метод toString() вызывается автоматически только при добавлении его в строку (т. Е. Литеральную строку или другую переменную, объявленную как String).Для других целей вам необходимо явно вызвать toString().Следовательно, строка-3 должна быть:

String shortMenu1 = Dish.menu.stream().map(Dish::toString).collect(joining()); //line-3
0 голосов
/ 09 октября 2018

Вы можете присоединиться к CharSequence s только как мандаты Collectors::joining, ваш поток с другой стороны равен Stream<Dish> (в этой строке-3), он просто не будет соответствовать определению и не будет компилироваться - вот чтоВы получаете.

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