8.2.1 使用Lambda表达式遍历集合

8.2.1 使用Lambda表达式遍历集合

函数式接口

所谓函数式接口就是只有一个抽象方法的接口,可以通过Lambda表达式来创建函数式接口实例.

Iterable接口的forEach方法

Java 8Iterable接口新增了一个forEach(Consumer action)默认方法,该方法的方法签名如下

Iterable的forEach方法签名 描述
default void forEach(Consumer<? super T> action) Performs the given action for each element of the Iterable until all elements have been processed or the action throws an exception.

这个forEach方法所需参数的类型Consumer是一个函数式接口
Iterable接口是Collection接口的父接口,因此**Collection集合也可直接调用继承得到的forEach方法**。

Consumer函数式接口的accept方法

当程序调用IterableforEach(Consumer action)遍历集合元素时,程序会依次将集合元素传给Consumeraccept(T t)方法(accept方法是该接口中唯一的抽象方法)。

Consumer接口的抽象方法 描述
void accept(T t) Performs this operation on the given argument.

使用Lambda表达式来遍历集合

正因为Consumer是函数式接口,因此可以使用Lambda表达式来遍历集合元素.

程序示例

如下程序示范了使用Lambda表达式和匿名内部类方式来遍历集合元素。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import java.util.*;
import java.util.function.Consumer;

public class CollectionEach {
public static void main(String[] args) {
// 创建一个集合
Collection<String> Strs = new HashSet<>();
Strs.add("1");
Strs.add("2");
Strs.add("3");
Strs.add("4");
Strs.add("5");
// 调用forEach()方法遍历集合,使用Lambda表达式方式
Strs.forEach(str -> System.out.println("Lambda表达式 遍历:" + str));
System.out.println("-----------------------");
// 调用forEach()方法遍历集合,使用匿名内部类方式:
Strs.forEach(new Consumer<String>() {
@Override
public void accept(String str) {
System.out.println("匿名内部类 遍历:" + str);
}
});
}
}

运行效果:

1
2
3
4
5
6
7
8
9
10
Lambda表达式 遍历:1
Lambda表达式 遍历:2
Lambda表达式 遍历:3
Lambda表达式 遍历:4
Lambda表达式 遍历:5
-----------------------
匿名内部类 遍历:1
匿名内部类 遍历:2
匿名内部类 遍历:3
匿名内部类 遍历:4

上面程序中调用了IterableforEach默认方法来遍历集合元素,传给该方法的参数是个Lambda表达式,该Lambda表达式的目标类型是Consumer
forEach()方法会自动将集合元素逐个地传给Lambda表达式的形参,这样Lambda表达式的代码体即可遍历到集合元素了。