PDF 课件和源代码下载地址:
https://gitee.com/geektime-geekbang/LetsJava
作者回复: Lambda的思维模式确实是有点不一样的。它是以数据的转换为基础的。之前的模式下,参数是数据,也就是“操作(数据)”。Lambda的情况下,参数是操作,也就是“数据(操作)”。正好相反。 比如说,之前是System.out.println(strData)。Lambda的情况下就是dataList.foreach(System.out :: println),括号里是操作。(而实际上在Java里,这个foreach也是变成了一个循环的)。 对于你的困惑。首先,“为什么forEach那里会是System.out(OutputStream类型)呢?”foreach里并不是一个OutputStream类型,而是System.out这个兑现的println方法。也就是说,System.out这个对象的println方法就是操作, 是想对list里每个元素执行的操作。 祝你速速顿悟Lambda大法的奥义。
作者回复: 无代码,不问题。
作者回复: 读取的buffer不用我们关心。我们只管读就行了,buffer是底层的操作。
作者回复: lambda的话,不能用我们之前的视角来看它是遍历了多少次。lambda可以这么理解,每一步都是一个运算子(operator),其中每个元素依次被运算子处理。至于它是像之前我们理解的那样先把所有元素都执行一边第一个运算子,再第二个,第三个,还是先把第一个元素执行完毕所有运算子,再操作第二个元素,直到所有元素被操作完毕,不是我们使用lambda的时候所关心的。 但是就lambda本身,是倾向于第二种的。也就是在一个元素上依次执行所有运算子。所以底层来说,也只是遍历了一遍。 stream本身还支持parallel,第二种模式更自然。 Java里的代码,关键点在 downstream.accept(u); 供你参考 @Override public final Stream<P_OUT> filter(Predicate<? super P_OUT> predicate) { Objects.requireNonNull(predicate); return new StatelessOp<P_OUT, P_OUT>(this, StreamShape.REFERENCE, StreamOpFlag.NOT_SIZED) { @Override Sink<P_OUT> opWrapSink(int flags, Sink<P_OUT> sink) { return new Sink.ChainedReference<P_OUT, P_OUT>(sink) { @Override public void begin(long size) { downstream.begin(-1); } @Override public void accept(P_OUT u) { if (predicate.test(u)) downstream.accept(u); } }; } }; }
作者回复: 是的
作者回复: ✅
作者回复: ppt在后面第六章有介绍,同时也介绍了处理这类问题的一般思路和过程。相信可以帮你解决word和pdf的问题。 打包rar估计不大行,rar的压缩算法是有版权的。zip可以用maven插件解决,maven也是在第六章有介绍。
作者回复: if (nextChar >= nChars) { /* EOF */ if (s != null && s.length() > 0) return s.toString(); else return null; <--- }