Java Streams 是 Java 8 引入的一种新的数据处理方式,它允许你以声明性方式处理数据集合(如列表、集合等)。Streams 提供了丰富的中间操作(如 filter、map、sorted 等)和终端操作(如 collect、forEach、reduce 等),使得数据处理更加简洁和高效。
Java Streams 主要有两种类型:
filter
、map
、sorted
等。collect
、forEach
、reduce
等。Java Streams 广泛应用于数据处理、集合操作、过滤、映射、聚合等场景。
假设我们有一个列表,我们希望根据某些条件添加多个值到这个列表中。我们可以使用 Streams 来实现这一点。
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
public class StreamExample {
public static void main(String[] args) {
List<Integer> numbers = new ArrayList<>();
numbers.add(1);
numbers.add(2);
numbers.add(3);
numbers.add(4);
numbers.add(5);
// 条件:如果数字大于 2,则添加 10 和 20
List<Integer> result = numbers.stream()
.flatMap(number -> {
List<Integer> newList = new ArrayList<>();
if (number > 2) {
newList.add(10);
newList.add(20);
}
newList.add(number);
return newList.stream();
})
.collect(Collectors.toList());
System.out.println(result); // 输出: [1, 2, 3, 10, 20, 4, 10, 20, 5, 10, 20]
}
}
stream()
方法将列表转换为 Stream。flatMap
方法来处理每个数字。如果数字大于 2,我们添加 10 和 20 到一个新的列表中,然后将原始数字也添加到这个列表中。collect
方法将 Stream 转换回列表。原因:在使用并行流时,可能会出现并发问题,导致数据不一致或重复。
解决方法:可以使用 Collectors.toConcurrentMap
或 Collectors.toCollection
等并发安全的收集器来解决并发问题。
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;
public class ConcurrentStreamExample {
public static void main(String[] args) {
List<Integer> numbers = List.of(1, 2, 3, 4, 5);
Map<Integer, Integer> result = numbers.parallelStream()
.collect(Collectors.toConcurrentMap(
number -> number,
number -> number * 2
));
System.out.println(result); // 输出: {1=2, 2=4, 3=6, 4=8, 5=10}
}
}
在这个示例中,我们使用 Collectors.toConcurrentMap
来确保在并行流操作中的线程安全。
希望这些信息对你有所帮助!
领取专属 10元无门槛券
手把手带您无忧上云