类型Stream <dish>中的方法collect(Collector <!-?super Dish,A,R->)不适用于参数(Collector <charsequence,capture#3-of?,string =“”>)

时间:2018-10-09 11:17:42

标签: java-8

对于下面开发的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 :(得分:2)

您已经有了Lombok注释@Data,该注释会自动创建一个toString()方法,因此大概您希望第3行能够正常工作。 toString()方法仅在将其添加到字符串(即文字字符串或声明为String的另一个变量)时自动调用。对于其他用途,您需要显式调用toString()。因此,第3行应为:

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

答案 1 :(得分:1)

您只能按照x的要求加入CharSequence,而您的Stream是Collectors::joining(在第3行中),它​​将根本不符合定义,并且无法编译-这就是您得到的。