【问题标题】:Why is it wrong? about java 8 streaming为什么是错的?关于 java 8 流式传输
【发布时间】:2014-10-23 05:48:36
【问题描述】:
public interface Filter<M> {

    boolean match(M m);

    public static <T> Collection<T> filter(Collection<T> collection, Filter<T> filter) {
        return collection.stream().filter(filter::match).collect(Collectors.toList());
    }

    ////////////////////////////////////////////////////////////////

    public static void main(String[] args) {
        ArrayList<Integer> intList = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8));
        System.out.println(intList);

        List<Integer> list = filter(intList, null);

        System.out.println(list);
    }
}

我正在学习 java 8 流功能,这是我有问题的代码...

我不知道为什么参数 intList 不匹配 filter() 方法。 Java 应该知道&lt;T&gt; 在这里是Integer,对吧?

【问题讨论】:

  • 请将您的代码发布为代码,而不是屏幕截图。你在这里的做法让我们更难自己重现问题。
  • 附带说明:如果您不修改intList,如您的代码示例,则无需将Arrays.asList 的结果包装成ArrayList,它 已经是List。另一方面,如果你有一个像ArrayList 这样的可变列表并且你不再需要intList 的原始内容,那么每个Collection 上都有removeIf(Predicate),允许就地过滤。无论哪种情况,您都可以简化代码……

标签: java collections java-8


【解决方案1】:

我还不确定您为什么会收到该特定错误,但问题是您的方法声明它将返回Collection&lt;T&gt;,但您试图将结果分配给List&lt;T&gt;。如果将filter的声明改为:

public static <T> List<T> filter(Collection<T> collection, Filter<T> filter)

...然后它编译没有问题。

【讨论】:

  • 是的,我将list 更改为Collection&lt;Integer&gt;,错误也消失了。它看起来更像是返回类型错误而不是参数类型错误。谢谢。
  • 他也可以像这样转换结果:List&lt;Integer&gt; list = (List&lt;Integer&gt;) filter(intList, null); 通过这个解决方案,他为许多其他对象保留了 Collection 返回类型
  • @ManuZi:但这是一个较弱的解决方案——该方法肯定会返回一个列表,因为它使用Collectors.toList(),因此指定它返回一个列表是有意义的。 ..
  • @JonSkeet 我的错我没看到。对不起,你完全正确。
猜你喜欢
  • 2021-04-08
  • 1970-01-01
  • 2014-04-21
  • 1970-01-01
  • 2012-01-05
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多