Stream API 是 Java 8 中引入的一个新的 API,它提供了一种更加简单、灵活、高效的处理集合、数组等数据集合的方式。在 Stream API 中,数据集合被抽象成一个流(Stream),而对流的处理则可以通过链式调用一系列操作完成,操作可以是过滤、映射、排序、聚合等。使用 Stream API 可以提高代码的可读性和简洁性,并且可以充分利用现代多核 CPU 的并行处理能力,提高代码的运行效率。
下面是 Stream API 的一些基本用法和示例:
1.创建流
可以通过集合、数组、生成器等方式创建一个流,例如:
List list = Arrays.asList(1, 2, 3, 4, 5);
Stream stream1 = list.stream();
Integer[] array = {1, 2, 3, 4, 5};
Stream stream2 = Arrays.stream(array);
Stream stream3 = Stream.of(1, 2, 3, 4, 5);
Stream stream4 = Stream.generate(() -> new Random().nextInt(100)).limit(10);
Stream stream5 = Stream.iterate(1, i -> i + 1).limit(10);
2.中间操作
在一个流上可以进行多次中间操作,每次操作都会返回一个新的流,例如:
Stream stream = Stream.of(1, 2, 3, 4, 5);
Stream filteredStream = stream.filter(i -> i % 2 == 0);
Stream mappedStream = filteredStream.map(i -> i * 2);
Stream sortedStream = mappedStream.sorted();
上面的代码创建了一个流,然后通过 filter() 方法过滤出偶数,再通过 map() 方法将每个偶数乘以 2,最后通过 sorted() 方法排序。
3.终止操作
在一个流上进行完所有的中间操作后,需要进行终止操作才能触发流的处理,例如:
Stream stream = Stream.of(1, 2, 3, 4, 5);
int sum = stream.filter(i -> i % 2 == 0).map(i -> i * 2).reduce(0, Integer::sum);
上面的代码创建了一个流,然后通过 filter() 方法过滤出偶数,再通过 map() 方法将每个偶数乘以 2,最后通过 reduce() 方法将结果相加。
4.并行处理
Stream API 支持并行处理,可以通过 parallel() 方法将一个串行流转换成并行流,例如:
List list = Arrays.asList(1, 2, 3, 4, 5);
int sum = list.parallelStream().filter(i -> i % 2 == 0).map(i -> i * 2).reduce(0, Integer::sum);
上面的代码创建了一个集合,然后通过 parallelStream() 方法将集合转换成并行流,并且在进行 filter()、map() 和 reduce() 操作时利用了多核 CPU 的并行处理能力
使用例子
基础写法
for (Object row : setting.getJsonArray("xxxx")) {
JsonObject rule = (JsonObject) row;
if (rule.getJsonArray("typeCode").contains("aaa") && rule.getBoolean("enabled")) {
for (Object eventRow : rule.getJsonArray("events")) {
JsonObject eventRule = (JsonObject) eventRow;
if (eventRule.getString("code").equals(event) && eventRule.getBoolean("enable")) {
this.notifyMessage(ticket, rule.getString("eventRow"));
}
}
}
}
使用stream以后
setting.getJsonArray("xxxx")
.stream()
.map(row -> (JsonObject) row)
.filter(rule -> rule.getJsonArray("typeCode").contains("aaa") && rule.getBoolean("enabled"))
.forEach(rule -> {
rule.getJsonArray("events")
.stream()
.map(eventRow -> (JsonObject) eventRow)
.filter(eventRule -> eventRule.getString("code").equals(event) && eventRule.getBoolean("enable"))
.forEach(eventRule -> this.notifyMessage(ticket, rule.getString("eventRow")));
});
普通写法
JsonArray configArray = new JsonArray();
defaultConfig.forEach(row -> {
configArray.add(new JsonObject()
.put("key", row)
.put("option", noOption.contains(row) ? 0 : 1)
.put("select", 1)
);
});
userConfig.forEach(row -> {
configArray.add(new JsonObject()
.put("key", row)
.put("option", noOption.contains(row) ? 0 : 1)
.put("select", 0)
);
});
使用Stream以后
List configList = Stream.concat(defaultConfig.stream(), userConfig.stream())
.map(row -> new JsonObject()
.put("key", row)
.put("option", noOption.contains(row) ? 0 : 1)
.put("select", defaultConfig.contains(row) ? 1 : 0))
.collect(Collectors.toList());
return new JsonArray(configList);