使用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不仅提高了代码的可维护性,也让我们能更专注于业务逻辑的实现。

相关文章
|
2月前
|
存储 安全 Java
Java 集合框架中的老炮与新秀:HashTable 和 HashMap 谁更胜一筹?
嗨,大家好,我是技术伙伴小米。今天通过讲故事的方式,详细介绍 Java 中 HashMap 和 HashTable 的区别。从版本、线程安全、null 值支持、性能及迭代器行为等方面对比,帮助你轻松应对面试中的经典问题。HashMap 更高效灵活,适合单线程或需手动处理线程安全的场景;HashTable 较古老,线程安全但性能不佳。现代项目推荐使用 ConcurrentHashMap。关注我的公众号“软件求生”,获取更多技术干货!
52 3
|
1天前
|
数据采集 JSON Java
Java爬虫获取微店快递费用item_fee API接口数据实现
本文介绍如何使用Java开发爬虫程序,通过微店API接口获取商品快递费用(item_fee)数据。主要内容包括:微店API接口的使用方法、Java爬虫技术背景、需求分析和技术选型。具体实现步骤为:发送HTTP请求获取数据、解析JSON格式的响应并提取快递费用信息,最后将结果存储到本地文件中。文中还提供了完整的代码示例,并提醒开发者注意授权令牌、接口频率限制及数据合法性等问题。
|
1天前
|
数据采集 存储 Java
Java爬虫获取微店店铺所有商品API接口设计与实现
本文介绍如何使用Java设计并实现一个爬虫程序,以获取微店店铺的所有商品信息。通过HttpClient发送HTTP请求,Jsoup解析HTML页面,提取商品名称、价格、图片链接等数据,并将其存储到本地文件或数据库中。文中详细描述了爬虫的设计思路、代码实现及注意事项,包括反爬虫机制、数据合法性和性能优化。此方法可帮助商家了解竞争对手,为消费者提供更全面的商品比较。
|
22天前
|
算法 Java 程序员
菜鸟之路Day06一一Java常用API
《菜鸟之路Day06——Java常用API》由blue编写,发布于2025年1月24日。本文详细介绍了Java中常用的API,包括JDK7的时间类(Date、SimpleDateFormat、Calendar)和JDK8新增的时间API(ZoneId、Instant、DateTimeFormatter等),以及包装类的使用。通过多个实例练习,如时间计算、字符串转整数、十进制转二进制等,帮助读者巩固所学内容,提升编程技能。文章强调了理论与实践结合的重要性,鼓励读者多做练习以提高学习效率。
76 28
|
5天前
|
缓存 Java 应用服务中间件
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
27 5
|
1月前
|
Web App开发 JSON 测试技术
API测试工具集合:让接口测试更简单高效
在当今软件开发领域,接口测试工具如Postman、Apifox、Swagger等成为确保API正确性、性能和可靠性的关键。Postman全球闻名但高级功能需付费,Apifox则集成了API文档、调试、Mock与自动化测试,简化工作流并提高团队协作效率,特别适合国内用户。Swagger自动生成文档,YApi开源但功能逐渐落后,Insomnia界面简洁却缺乏团队协作支持,Paw仅限Mac系统。综合来看,Apifox是国内用户的理想选择,提供中文界面和免费高效的功能。
|
1月前
|
JSON Java 数据挖掘
利用 Java 代码获取淘宝关键字 API 接口
在数字化商业时代,精准把握市场动态与消费者需求是企业成功的关键。淘宝作为中国最大的电商平台之一,其海量数据中蕴含丰富的商业洞察。本文介绍如何通过Java代码高效、合规地获取淘宝关键字API接口数据,帮助商家优化产品布局、制定营销策略。主要内容包括: 1. **淘宝关键字API的价值**:洞察用户需求、优化产品标题与详情、制定营销策略。 2. **获取API接口的步骤**:注册账号、申请权限、搭建Java开发环境、编写调用代码、解析响应数据。 3. **注意事项**:遵守法律法规与平台规则,处理API调用限制。 通过这些步骤,商家可以在激烈的市场竞争中脱颖而出。
|
2月前
|
JSON Java Apache
Java基础-常用API-Object类
继承是面向对象编程的重要特性,允许从已有类派生新类。Java采用单继承机制,默认所有类继承自Object类。Object类提供了多个常用方法,如`clone()`用于复制对象,`equals()`判断对象是否相等,`hashCode()`计算哈希码,`toString()`返回对象的字符串表示,`wait()`、`notify()`和`notifyAll()`用于线程同步,`finalize()`在对象被垃圾回收时调用。掌握这些方法有助于更好地理解和使用Java中的对象行为。
|
2月前
|
存储 缓存 安全
Java 集合江湖:底层数据结构的大揭秘!
小米是一位热爱技术分享的程序员,本文详细解析了Java面试中常见的List、Set、Map的区别。不仅介绍了它们的基本特性和实现类,还深入探讨了各自的使用场景和面试技巧,帮助读者更好地理解和应对相关问题。
60 5
|
运维 监控 Java
Java版阿里云通信短信发送API接口实例(1)
Java版阿里云通信短信发送API接口实例(新)
1147 0
Java版阿里云通信短信发送API接口实例(1)

热门文章

最新文章