面试复习之java stream
一些随笔和一些知识点。
说实在的,stream在对日项目里不常用的东西,很多人看不懂,代码维护就会很难,整体对日项目的水平确实就那样,令人堪忧。
最近有面试官问我Function和Consumer的问题,我也没复习一时之间也没答出来,一是没复习到二是6个月没碰java都忘记了。后话。。。。
我谈谈理解吧:也不是从哪抄过来的。
我们知道java stream 是java提供的一种面向函数式的编程方式 ----大前提!
其实就是说java stream 提供了一套规范的函数式接口和一套具体实现
①一套规范的函数式接口 位于java.util.function下
没那么复杂,常用的就那么几个 Function,Consumer,Supplier,Predicate
其实简单来说就是Function是一个有input和result,Consumer只有input没有result,Supplier没有input只有result,Predicate有input,返回是一个boolean。
这里面还有一个重要的概念就是----函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。
* @param <T> the type of the input to the function * @param <R> the type of the result of the function public interface Function<T, R> { // Applies this function to the given argument. // 顾名思义了 具体处理就写在这里 R apply(T t); // ③ // static <T> Function<T, T> identity() { return t -> t; } // 这个方法乍一看,返回了一个Function<T, V>的函数对象,lambda表达式的必要条件是有且只有一个抽象方法,即apply
// 也就是返回的该函数当调用apply方法后 才会执行after.apply(apply(t))代码块。
// 通过上述手法我们得知important point是,返回的函数只会在调用apply方法后才会执行。
default <V> Function<T, V> andThen(Function<? super R, ? extends V> after) {
Objects.requireNonNull(after);
return (T t) -> after.apply(apply(t));
}
// 下面的写法是改用匿名内部类写的,在②处代码apply(t)会调用①处代码,
// 而用lambda表达式会调用③的代码。可以看出lambda调用外层方法,而匿名内部类调用不了外层方法。
default Function<T, V> andThen(Function<R, V> after) {
Objects.requireNonNull(after);
return new Function () {
@Override
public V apply (T t) { // ①
return after.apply(apply(t)) // ②
}
}
}
②一套具体实现 位于java.util.stream下
这个稍微复杂一些,单独看源代码,不如在网上找一些理论的基础上便理解边看。
https://www.runoob.com/java/java8-streams.html
上面这个地址就有!
其实说白了就是
-
stream() − 为集合创建串行流。
-
parallelStream() − 为集合创建并行流。