关于Stream中方法引用的一个小问题


 ArrayList<Double> d = new ArrayList<>();
        Stream.generate(Math::random).limit(100).forEach(d::add);
        System.out.println(d);

这是idea提示需要一个consumer表达式,为什么写了一个有返回值(boolean)的方法add也没问题?

这里只是要传一个接口进去而已,然后forEach自己调用这个接口里的方法,而这个Consumer接口里的方法是没有返回值的。你传的这个是方法引用,相当于简写了很多,完整的lambda写法如下

        ArrayList<Double> d = new ArrayList<>();
        Stream.generate(Math::random).limit(100).forEach((var) -> {
            d.add(var);
        });

直接传接口

        ArrayList<Double> d = new ArrayList<>();
        Stream.generate(Math::random).limit(100).forEach(new Consumer<Double>() {
            @Override
            public void accept(Double var) {
                d.add(var);
            }
        });
        System.out.println(d);

这样应该理解了吧