Stream API 使用

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);

你可能感兴趣的:(java,开发语言)