使用Java Stream API简化集合操作

简介: 使用Java Stream API简化集合操作

使用Java Stream API简化集合操作

今天我们将探讨如何使用Java Stream API来简化集合操作。Java 8引入了Stream API,它提供了一种高效且易读的方式来处理集合数据。通过使用Stream API,我们可以避免繁琐的循环和条件判断,使代码更加简洁和优雅。

1. 什么是Stream API

Stream API是一种用于处理集合的框架,它允许我们以声明性方式(就像SQL语句)处理数据。Stream操作可以分为中间操作和终端操作,其中中间操作返回一个新的Stream,允许操作链式调用,而终端操作会产生结果或者副作用。

2. 创建Stream

Stream可以从各种数据源创建,如集合、数组或I/O通道等。下面是一些常见的创建Stream的方式:

package cn.juwatech.stream;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;
public class StreamCreationExample {
    public static void main(String[] args) {
        // 从集合创建
        List<String> list = Arrays.asList("a", "b", "c");
        Stream<String> streamFromList = list.stream();
        // 从数组创建
        String[] array = {"a", "b", "c"};
        Stream<String> streamFromArray = Arrays.stream(array);
        // 直接创建
        Stream<String> streamDirect = Stream.of("a", "b", "c");
    }
}

3. 常见的中间操作

中间操作返回一个新的Stream,并且是惰性执行的。常见的中间操作包括filter、map、flatMap、sorted、distinct等。

3.1 filter

filter用于对Stream中的元素进行过滤,保留满足条件的元素。

package cn.juwatech.stream;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class StreamFilterExample {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
        List<Integer> evenNumbers = numbers.stream()
                                           .filter(n -> n % 2 == 0)
                                           .collect(Collectors.toList());
        System.out.println(evenNumbers); // 输出: [2, 4, 6]
    }
}

3.2 map

map用于将Stream中的每个元素映射到另一个元素,通常用于元素类型的转换。

package cn.juwatech.stream;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class StreamMapExample {
    public static void main(String[] args) {
        List<String> words = Arrays.asList("hello", "world");
        List<Integer> wordLengths = words.stream()
                                         .map(String::length)
                                         .collect(Collectors.toList());
        System.out.println(wordLengths); // 输出: [5, 5]
    }
}

3.3 flatMap

flatMap用于将每个元素转换成一个Stream,并将多个Stream合并成一个Stream。

package cn.juwatech.stream;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class StreamFlatMapExample {
    public static void main(String[] args) {
        List<List<String>> listOfLists = Arrays.asList(
            Arrays.asList("a", "b"),
            Arrays.asList("c", "d"),
            Arrays.asList("e", "f")
        );
        List<String> flattenedList = listOfLists.stream()
                                                .flatMap(List::stream)
                                                .collect(Collectors.toList());
        System.out.println(flattenedList); // 输出: [a, b, c, d, e, f]
    }
}

3.4 sorted

sorted用于对Stream中的元素进行排序,默认是自然排序,也可以传入比较器进行自定义排序。

package cn.juwatech.stream;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class StreamSortedExample {
    public static void main(String[] args) {
        List<String> words = Arrays.asList("banana", "apple", "cherry");
        List<String> sortedWords = words.stream()
                                        .sorted()
                                        .collect(Collectors.toList());
        System.out.println(sortedWords); // 输出: [apple, banana, cherry]
    }
}

3.5 distinct

distinct用于去重,返回由Stream中唯一元素组成的Stream。

package cn.juwatech.stream;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class StreamDistinctExample {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(1, 2, 2, 3, 3, 3, 4, 4, 4, 4);
        List<Integer> distinctNumbers = numbers.stream()
                                               .distinct()
                                               .collect(Collectors.toList());
        System.out.println(distinctNumbers); // 输出: [1, 2, 3, 4]
    }
}

4. 常见的终端操作

终端操作会触发Stream的执行,并且会产生一个结果或副作用。常见的终端操作包括forEach、collect、reduce、count、anyMatch等。

4.1 forEach

forEach用于遍历Stream中的每个元素,并对其执行指定的操作。

package cn.juwatech.stream;
import java.util.Arrays;
import java.util.List;
public class StreamForEachExample {
    public static void main(String[] args) {
        List<String> words = Arrays.asList("hello", "world");
        words.stream().forEach(System.out::println);
        // 输出: 
        // hello
        // world
    }
}

4.2 collect

collect用于将Stream中的元素收集到一个集合或其他容器中。最常见的收集器是Collectors.toList()。

package cn.juwatech.stream;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
public class StreamCollectExample {
    public static void main(String[] args) {
        List<String> words = Arrays.asList("hello", "world", "hello");
        Set<String> uniqueWords = words.stream()
                                       .collect(Collectors.toSet());
        System.out.println(uniqueWords); // 输出: [world, hello]
    }
}

4.3 reduce

reduce用于将Stream中的元素组合起来,生成一个单一的值。常见的操作有求和、求积、求最大值等。

package cn.juwatech.stream;
import java.util.Arrays;
import java.util.List;
public class StreamReduceExample {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
        int sum = numbers.stream()
                         .reduce(0, Integer::sum);
        System.out.println(sum); // 输出: 15
    }
}

4.4 count

count用于计算Stream中元素的个数。

package cn.juwatech.stream;
import java.util.Arrays;
import java.util.List;
public class StreamCountExample {
    public static void main(String[] args) {
        List<String> words = Arrays.asList("hello", "world", "hello");
        long count = words.stream().count();
        System.out.println(count); // 输出: 3
    }
}

4.5 anyMatch

anyMatch用于判断Stream中是否至少有一个元素满足给定的条件。

package cn.juwatech.stream;
import java.util.Arrays;
import java.util.List;
public class StreamAnyMatchExample {
    public static void main(String[] args) {
        List<String> words = Arrays.asList("hello", "world", "hello");
        boolean hasHello = words.stream().anyMatch("hello"::equals);
        System.out.println(hasHello); // 输出: true
    }
}

通过以上示例代码,我们可以看到Java Stream API如何简化集合操作,使代码更加简洁和易读。Stream API不仅提高了代码的可维护性,也让我们能更专注于业务逻辑的实现。

相关文章
|
19天前
|
Java API 数据处理
Java新特性:使用Stream API重构你的数据处理
Java新特性:使用Stream API重构你的数据处理
|
26天前
|
Java 大数据 API
Java Stream API:现代集合处理与函数式编程
Java Stream API:现代集合处理与函数式编程
185 100
|
26天前
|
Java API 数据处理
Java Stream API:现代集合处理新方式
Java Stream API:现代集合处理新方式
205 101
|
9天前
|
存储 算法 安全
Java集合框架:理解类型多样性与限制
总之,在 Java 题材中正确地应对多样化与约束条件要求开发人员深入理解面向对象原则、范式编程思想以及JVM工作机理等核心知识点。通过精心设计与周密规划能够有效地利用 Java 高级特征打造出既健壮又灵活易维护系统软件产品。
38 7
|
2月前
|
JSON API 数据格式
淘宝/天猫图片搜索API接口,json返回数据。
淘宝/天猫平台虽未开放直接的图片搜索API,但可通过阿里妈妈淘宝联盟或天猫开放平台接口实现类似功能。本文提供基于淘宝联盟的图片关联商品搜索Curl示例及JSON响应说明,适用于已获权限的开发者。如需更高精度搜索,可选用阿里云视觉智能API。
|
2月前
|
JSON API 数据安全/隐私保护
深度分析淘宝卖家订单详情API接口,用json返回数据
淘宝卖家订单详情API(taobao.trade.fullinfo.get)是淘宝开放平台提供的重要接口,用于获取单个订单的完整信息,包括订单状态、买家信息、商品明细、支付与物流信息等,支撑订单管理、ERP对接及售后处理。需通过appkey、appsecret和session认证,并遵守调用频率与数据权限限制。本文详解其使用方法并附Python调用示例。
|
1月前
|
数据可视化 测试技术 API
从接口性能到稳定性:这些API调试工具,让你的开发过程事半功倍
在软件开发中,接口调试与测试对接口性能、稳定性、准确性及团队协作至关重要。随着开发节奏加快,传统方式已难满足需求,专业API工具成为首选。本文介绍了Apifox、Postman、YApi、SoapUI、JMeter、Swagger等主流工具,对比其功能与适用场景,并推荐Apifox作为集成度高、支持中文、可视化强的一体化解决方案,助力提升API开发与测试效率。
|
2月前
|
JSON 算法 安全
淘宝商品详情API接口系列,json数据返回
淘宝开放平台提供了多种API接口用于获取商品详情信息,主要通过 淘宝开放平台(Taobao Open Platform, TOP) 的 taobao.tbk.item.info.get(淘宝客商品详情)或 taobao.item.get(标准商品API)等接口实现。以下是关键信息及JSON返回示例:
|
9天前
|
JSON API 数据安全/隐私保护
Python采集淘宝拍立淘按图搜索API接口及JSON数据返回全流程指南
通过以上流程,可实现淘宝拍立淘按图搜索的完整调用链路,并获取结构化的JSON商品数据,支撑电商比价、智能推荐等业务场景。
|
18天前
|
JSON 前端开发 API
如何调用体育数据足篮接口API
本文介绍如何调用体育数据API:首先选择可靠服务商并注册获取密钥,接着阅读文档了解基础URL、端点、参数及请求头,然后使用Python等语言发送请求、解析JSON数据,最后将数据应用于Web、App或分析场景,同时注意密钥安全、速率限制与错误处理。

热门文章

最新文章