面试复习之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() − 为集合创建并行流。

 

posted on 2020-12-16 21:20  剑姬  阅读(189)  评论(0编辑  收藏  举报

导航