在日常开发中,我们经常需要对集合进行各种操作,比如过滤、映射、排序、聚合等。传统的做法是使用for
循环或Iterator
,代码冗长且容易出错。比如:
List<String> names = new ArrayList<>();
for (User user : users) {
if (user.getAge() > 18) {
names.add(user.getName().toUpperCase());
}
}
这样的代码不仅难以维护,还容易引入bug。幸运的是,Java 8引入了Stream API
,它提供了一种更高效、更优雅的方式来处理集合数据。
Stream
是Java 8中新增的一个抽象层,它允许我们以声明式的方式处理数据集合。Stream
的核心思想是将数据操作分为中间操作(Intermediate Operations)和终端操作(Terminal Operations)。
Stream
,可以链式调用(如filter
、map
、sorted
)。collect
、forEach
、reduce
)。从集合创建:
List<String> list = Arrays.asList("Java", "Python", "C++");
Stream<String> stream = list.stream();
从数组创建:
String[] array = {"Java", "Python", "C++"};
Stream<String> stream = Arrays.stream(array);
使用Stream.of
创建:
Stream<String> stream = Stream.of("Java", "Python", "C++");
filter
用于过滤符合条件的元素。
List<String> languages = Arrays.asList("Java", "Python", "C++", "JavaScript");
List<String> result = languages.stream()
.filter(lang -> lang.startsWith("J"))
.collect(Collectors.toList());
// 结果:["Java", "JavaScript"]
map
用于将元素转换为另一种形式。
List<String> languages = Arrays.asList("Java", "Python", "C++");
List<Integer> lengths = languages.stream()
.map(String::length)
.collect(Collectors.toList());
// 结果:[4, 6, 3]
sorted
用于对元素进行排序。
List<String> languages = Arrays.asList("Java", "Python", "C++");
List<String> sorted = languages.stream()
.sorted()
.collect(Collectors.toList());
// 结果:["C++", "Java", "Python"]
reduce
用于将流中的元素聚合成一个结果。
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = numbers.stream()
.reduce(0, Integer::sum);
// 结果:15
distinct
用于去除重复元素。
List<String> languages = Arrays.asList("Java", "Python", "Java", "C++");
List<String> unique = languages.stream()
.distinct()
.collect(Collectors.toList());
// 结果:["Java", "Python", "C++"]
flatMap
用于将嵌套的流扁平化。
List<List<String>> nested = Arrays.asList(
Arrays.asList("Java", "Python"),
Arrays.asList("C++", "JavaScript")
);
List<String> flat = nested.stream()
.flatMap(List::stream)
.collect(Collectors.toList());
// 结果:["Java", "Python", "C++", "JavaScript"]
groupingBy
用于根据某个条件对元素进行分组。
List<String> languages = Arrays.asList("Java", "Python", "C++", "JavaScript");
Map<Integer, List<String>> grouped = languages.stream()
.collect(Collectors.groupingBy(String::length));
// 结果:{3=["C++"], 4=["Java"], 6=["Python"], 10=["JavaScript"]}
假设我们有一个User
列表,每个User
包含name
和age
字段。我们需要:
List<User> users = getUsers();
List<String> result = new ArrayList<>();
for (User user : users) {
if (user.getAge() > 18) {
result.add(user.getName().toUpperCase());
}
}
result.sort(String::compareTo);
if (result.size() > 5) {
result = result.subList(0, 5);
}
List<String> result = users.stream()
.filter(user -> user.getAge() > 18)
.map(user -> user.getName().toUpperCase())
.sorted()
.limit(5)
.collect(Collectors.toList());
Stream API
是Java中处理集合数据的利器,它让我们的代码更加简洁、易读,同时提高了开发效率。通过掌握Stream
的常用操作和高级特性,我们可以轻松应对各种复杂的数据处理需求。