文章目录
在Java 8中引入了Stream API以及Lambda表达式,这使得处理集合数据变得更加简洁高效。下面我将详细介绍一些常见的操作,并给出相应的代码示例。
Stream API
Stream API是一个用于处理集合数据的新工具,它支持声明式编程风格,允许你在数据源上执行复杂的查询操作。Stream API的核心组件包括Stream
接口及其子类型如IntStream
等。
Lambda 表达式
Lambda表达式是一种匿名函数,可以直接作为方法参数传递。它们是创建单方法接口(也称为函数式接口)实例的一种方式。
常用操作
1. 创建Stream
- 从集合创建:
List<String> list = Arrays.asList("a", "b", "c");
Stream<String> stream = list.stream();
- 通过数组创建:
String[] array = new String[]{"a", "b", "c"};
Stream<String> streamFromArray = Arrays.stream(array);
2. 中间操作(Intermediate Operations)
中间操作可以链接在一起形成流水线,每个操作都会返回一个新的流对象,除了终结操作外都不会执行任何计算。
filter
:过滤流中的元素。
Stream<String> filteredStream = stream.filter(s -> s.startsWith("a"));
map
:映射每个元素到另一个类型。
Stream<Integer> lengths = stream.map(String::length);
flatMap
:将流中的每个值替换成另一个流,然后将所有的流连接成一个流。
Stream<String> words = Stream.of("Hello World").flatMap(s -> Stream.of(s.split(" ")));
sorted
:排序流中的元素。
Stream<String> sortedStream = stream.sorted();
3. 终结操作(Terminal Operations)
终结操作会从流中产生结果或副作用。一旦执行了终结操作,流就被认为已被“消耗”,无法再在其上调用其他方法。
forEach
:遍历流中的每个元素。
stream.forEach(System.out::println);
collect
:收集流中的元素到集合或其他形式的结果中。
List<String> resultList = stream.collect(Collectors.toList());
reduce
:将流中的元素组合起来得到单一结果。
Optional<String> result = stream.reduce((s1, s2) -> s1 + s2);
anyMatch
,allMatch
,noneMatch
:测试是否至少有一个元素符合给定的条件。
boolean anyStartWithA = stream.anyMatch(s -> s.startsWith("a"));
findFirst
/findAny
:获取第一个/任意匹配的元素。
Optional<String> firstElement = stream.findFirst();
count
:返回流中的元素个数。
long count = stream.count();
示例
假设我们有一个用户列表,我们想找出所有姓“张”的用户的名字,并按名字长度排序后输出。
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
class User {
private String name;
// 构造器,getters 和 setters 省略
public User(String name) { this.name = name; }
public String getName() { return name; }
}
public class Main {
public static void main(String[] args) {
List<User> users = Arrays.asList(
new User("张三"),
new User("李四"),
new User("王五"),
new User("张飞")
);
List<String> names = users.stream()
.filter(user -> user.getName().startsWith("张"))
.sorted(Comparator.comparing(User::getName))
.map(User::getName)
.collect(Collectors.toList());
System.out.println(names); // 输出: [张三, 张飞]
}
}
以上就是使用Java 8 Stream API和Lambda表达式的常见操作以及一个简单的示例。希望这些信息对你有所帮助!