java8 :: 用法 (JDK8 双冒号用法)

JDK8中有双冒号的用法,就是把方法当做参数传到stream内部使stream的每个元素都传入到该方法里面执行一下

代码其实很简单:

以前的代码一般是如此的:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 public  class  AcceptMethod {        public  static  void   printValur(String str){          System.out.println( "print value : " +str);      }        public  static  void  main(String[] args) {          List<String> al = Arrays.asList( "a" , "b" , "c" , "d" );          for  (String a: al) {              AcceptMethod.printValur(a);          }        //下面的for each循环和上面的循环是等价的           al.forEach(x->{              AcceptMethod.printValur(x);          });      } }

  现在JDK双冒号是:

1 2 3 4 5 6 7 8 9 10 11 12 13 public  class  MyTest {      public  static  void   printValur(String str){          System.out.println( "print value : " +str);      }        public  static  void  main(String[] args) {          List<String> al = Arrays.asList( "a" "b" "c" "d" );          al.forEach(AcceptMethod::printValur);          //下面的方法和上面等价的          Consumer<String> methodParam = AcceptMethod::printValur;  //方法参数          al.forEach(x -> methodParam.accept(x)); //方法执行accept      } }

  

  上面的所有方法执行玩的结果都是如下:

1 2 3 4 print value : a print value : b print value : c print value : d

  在JDK8中,接口Iterable 8中默认实现了forEach方法,调用了 JDK8中增加的接口Consumer内的accept方法,执行传入的方法参数。

JDK源码如下:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 /**       * Performs the given action for each element of the {@code Iterable}       * until all elements have been processed or the action throws an       * exception.  Unless otherwise specified by the implementing class,       * actions are performed in the order of iteration (if an iteration order       * is specified).  Exceptions thrown by the action are relayed to the       * caller.       *       * @implSpec       * <p>The default implementation behaves as if:       * <pre>{@code       *     for (T t : this)       *         action.accept(t);       * }</pre>       *       * @param action The action to be performed for each element       * @throws NullPointerException if the specified action is null       * @since 1.8       */      default  void  forEach(Consumer<?  super  T> action) {          Objects.requireNonNull(action);          for  (T t :  this ) {              action.accept(t);          }      }

 另外补充一下,JDK8改动的,在接口里面可以有默认实现,就是在接口前加上default,实现这个接口的函数对于默认实现的方法可以不用再实现了。类似的还有static方法。现在这种接口除了上面提到的,还有BiConsumer,BiFunction,BinaryOperation等,在java.util.function包下的接口,大多数都有,后缀为Supplier的接口没有和别的少数接口。

    原文作者:zhangdefeng2008
    原文地址: https://blog.csdn.net/zhangdefeng2008/article/details/79346811
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞