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

  • Post author:
  • Post category:java



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的接口没有和别的少数接口。