使用 Java 8 中的 Stream ,可以让你写代码事半功倍

这篇具有很好参考价值的文章主要介绍了使用 Java 8 中的 Stream ,可以让你写代码事半功倍。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Stream

Java 8 中一个主要的新功能是引入了流(Stream)功能。在java.util.stream中包含用于处理元素序列的类。其中,最重要的类是Stream<T>。下面我们就来看看如何使用现有的数据源创建流。

创建Stream

可以使用 stream()of() 方法从不同的数据源(例如:集合、数组)创建流:

String[] arr = new String[]{"万", "猫", "学", "社"};
Stream<String> stream = Arrays.stream(arr);
stream = Stream.of("万", "猫", "学", "社");

Collection 接口新增了一个 stream() 默认方法,允许使用任何集合作为数据源来创建 Stream<T>

List<String> list = new ArrayList();
list.add("万");
list.add("猫");
list.add("学");
list.add("社");
Stream<String> stream = list.stream();

在多线程中使用Stream

Stream 还通过提供 parallelStream() 方法来简化多线程操作,该方法以并行模式运行对流元素的操作。

下面的代码可以对流的每个元素并行运行 doWork() 方法:

List<String> list = new ArrayList();
list.add("万");
list.add("猫");
list.add("学");
list.add("社");
list.parallelStream().forEach(element -> doWork(element));

接下来,我们将介绍一些基本的 Stream 操作。

Stream 操作

在流上可以执行许多有用的操作。它们被分为中间操作(返回 Stream<T>)和终端操作(返回明确定义类型的结果),中间操作允许链接。

我需要注意的是,流上的操作不会改变数据源。

下面是一个简单的例子:

List<String> list = new ArrayList();
list.add("万");
list.add("猫");
list.add("学");
list.add("社");
long count = list.stream().distinct().count();

在上面的例子中,distinct() 方法表示一个中间操作,它创建了前一个流的唯一元素的新流。而 count() 方法是一个终端操作,它返回流的大小。

迭代

Stream 帮助我们替代了 for、for-each 和 while 循环。它可以让我们把精力集中在操作的逻辑上,而不是在迭代元素序列上。

比如下面的代码:

for (String string : list) {
    if (string.contains("猫")) {
        return true;
    }
}

这段代码只需要一行 Stream 代码就可以实现:

boolean isExist = list.stream().anyMatch(element -> element.contains("猫"));

过滤

filter() 方法可以让我们选择满足谓词条件的元素流。

比如下面的代码:

List<String> list = new ArrayList();
list.add("万");
list.add("猫");
list.add("学");
list.add("社");
Stream<String> stream = list.stream().filter(element -> element.contains("猫"));

在上面的例子中,创建了一个 List<String>Stream<String>,查找该流中所有包含字符“猫”的元素,并创建一个只包含筛选后元素的新流。

映射

为了通过将特殊函数应用于流元素来转换它们,并将这些新元素收集到流中,我们可以使用 map() 方法。

比如下面的代码:

List<String> list = new ArrayList();
list.add("1");
list.add("2");
list.add("3");
Stream<Integer> stream = list.stream().map(str -> Integer.valueOf(str));

在上面的例子中,通过对初始流的每个元素应用特定的 lambda 表达式将 Stream<String> 转换为 Stream<Integer>

如果您有一个流,其中每个元素都包含其自己的元素序列,并且您想创建这些内部元素的流,则应使用 flatMap() 方法。

比如下面的代码:

public class Writer {
	private String name;
	private List<String> books;
}
List<Writer> writers = new ArrayList<>();
writers.add(new Writer());
Stream<String> stream = writers.stream().flatMap(writer -> writer.getBooks().stream());

在上面的例子中,我们有一个类型为 Writer 的元素列表。Writer 类包含一个类型为 List<String> 的字段 books。使用 flatMap() 方法,字段 books 中的每个元素将被提取并添加到新的结果流中。之后,最开始的 Stream 将会丢失。

匹配

Stream 提供了一组方便的工具,根据一些谓词验证一个序列的元素。我们可以使用以下方法之一:

  • anyMatch():只要有一个条件满足即返回true
  • allMatch():必须全部都满足才会返回true
  • noneMatch():全都不满足才会返回true

它们都返回 boolean 的终端操作。

比如下面的代码:

List<String> list = new ArrayList();
list.add("万");
list.add("猫");
list.add("学");
list.add("社");
list.stream().anyMatch(element -> element.contains("万")); // true
list.stream().allMatch(element -> element.contains("万")); // false
list.stream().noneMatch(element -> element.contains("万")); // false

对于空的 Stream,无论给定的谓词是什么,allMatch() 方法都将返回 true:

Stream.empty().anyMatch(Objects::nonNull); // false

这是一个合理的值,因为我们找不到不满足谓词的任何元素。

同样地,对于空的 Stream,anyMatch() 方法总是返回 false:

Stream.empty().anyMatch(Objects::nonNull); // false

同样地,这也是合理的,因为我们找不到满足这个条件的元素。

合并

我可以使用类型为 Stream 的 reduce() 方法,根据指定的函数将一系列元素合并为某个值。这个方法有两个参数:第一个是起始值,第二个是累加器函数。

比如下面的代码:

List<Integer> integers = Arrays.asList(1, 2, 3);
Integer reduced = integers.stream().reduce(4, (a, b) -> a + b);

在上面的例子中,有一个 List<Integer>,我们将这些元素加起来,并加上一个初始的整数(在这个例子中是4)。那么,运行以下代码的结果是10(4 + 1 + 2 + 3)。

收集

在 Stream 类型中,也可以通过 collect() 方法来进行收集。这个操作非常方便,可以将一个流转换为 CollectionMap,也可以将一个流表示为单个字符串。Collectors 是一个实用类,提供了几乎所有典型的收集操作的解决方案。对于一些不太常见的任务,可以创建自定义的收集器。

下面的代码使用终端操作 collect()Stream<String> 转换为 List<String>

List<String> resultList 
  = list.stream().map(element -> element.toUpperCase()).collect(Collectors.toList());

最后

Stream 的高级示例非常丰富,本文的目的是为了让我们快速了解 Stream 功能的用法,并启发我们继续探索和深入学习。

Stream 是 Java 8 中非常强大和实用的 API,它为开发人员提供了一种更加简便的方式来处理数据。希望我们通过本文的介绍和示例,可以快速上手使用 Stream,并继续深入学习和探索。文章来源地址https://www.toymoban.com/news/detail-441700.html

到了这里,关于使用 Java 8 中的 Stream ,可以让你写代码事半功倍的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 快速操控鼠标行为!Vue鼠标按键修饰符让你事半功倍

    快速操控鼠标行为!Vue鼠标按键修饰符让你事半功倍

        🎬 江城开朗的豌豆 :个人主页  🔥 个人专栏  :《 VUE 》 《 javaScript 》  📝  个人网站  :《 江城开朗的豌豆🫛 》  ⛺️ 生活的理想,就是为了理想的生活 !         欢迎来到前端入门之旅!这个专栏是为那些对Web开发感兴趣、刚刚开始学习前端的读者们打造

    2024年02月05日
    浏览(8)
  • Docker新手必读:这几个常用命令让你工作效率事半功倍

    Docker是一种容器化技术,它可以将应用程序及其所有依赖项以及运行时环境打包到一个可以部署和运行的独立的容器中。Docker容器是轻量级、可移植和具有可观察性的,可以在不同的开发、测试和生产环境中进行部署和运行。 Docker的主要特点包括: 简化应用程序开发和部署

    2024年02月03日
    浏览(13)
  • 30个极致实用的谷歌浏览器插件,让你开发事半功倍

    30个极致实用的谷歌浏览器插件,让你开发事半功倍

    浏览器是开发人员最强大的工具。99% 的人不会 100% 地利用他们的浏览器。这里有 30 个浏览器扩展,如果你能合理充分利用将大大提升你的开发效率。 \\\"WhatFont\\\",是一款帮助用户快速识别网页中字体信息的工具。 当你在浏览网页时,如果看到了一款你喜欢的字体,但不知道具

    2024年02月02日
    浏览(44)
  • 自媒体人ai写作必备!9款高效工具让你事半功倍! #AI写作#经验分享

    自媒体人ai写作必备!9款高效工具让你事半功倍! #AI写作#经验分享

    这些工具不仅可以快速生成高质量的文本内容,还可以根据用户的需求进行个性化定制。它们可以帮助我们节省大量的时间和精力,让我们更加专注于创意和细节的打磨。本文将为大家详细介绍几个AI写作工具,让你在写作领域更上一层楼。 1.飞鸟写作 这是一个微信公众号

    2024年04月29日
    浏览(10)
  • java中的stream基本使用

    Stream流把真正的函数式编程风格引入到Java中,而且代码特别简介。 1、获取Stream流 2、中间方法 3、终结方法 Collection体系集合 使用默认方法stream()生成流, default Stream stream() Map体系集合 把Map转成Set集合,间接的生成流 数组 通过Arrays中的静态方法stream生成流 同种数据类型的

    2024年02月15日
    浏览(13)
  • 使用Java8 Stream流中的Collectors.collectingAndThen()方法去重

    Collectors.collectingAndThen() 根据对象属性进行去重操作 Collectors.collectingAndThen()方法属于java8 Stream流中的 java.util.stream.Collectors ,此类实现了 java.util.stream.Collector 接口,还提供了大量的方法对Stream流中的元素进行 map 和 reduce 操作 在获取任务的时候,会出现id重复的状况,利用 Co

    2024年02月09日
    浏览(49)
  • 【工具使用】AI帮你写代码

    【工具使用】AI帮你写代码

    先说结论:该插件目前并不能完全取代程序员,正如他的名字Copilot,译为副驾驶。但在简单业务方面有着无与伦比的能力! 官方地址 传送门(点我) Copilot目前不提供公开使用,需要注册账号通过审核 GitHub Copilot 是一款 AI 结对程序员,可帮助您更快地编写代码并减少工作量

    2024年02月10日
    浏览(11)
  • JAVA 使用stream流将List中的对象某一属性创建新的List

    Java Stream是Java 8引入的一种新机制,它可以让我们以声明式方式操作集合数据,提供了更加简洁、优雅的集合处理方式。Stream是一个来自数据源的元素队列,并支持聚合操作。它的特点有: Stream 不会修改原始数据源。 Stream 操作是延迟执行的。 Stream 操作可以是无限的(比如

    2024年02月03日
    浏览(52)
  • Collections工具类,可以使用collections工具类对代码中的list进行分组

    当我们需要对代码list进行分组的时候,有时候使用for循环会显得很蠢,那么使用Colletions工具类就会很方便,根据所需要的分类值,进行映射分组集合,以上是案例 toMap 返回map集合 MapLong, ListLong toList 返回list集合 tips stream流一样好用

    2024年03月23日
    浏览(12)
  • 一分钟学会怎么让chatGPT帮你写python代码(含使用地址)

    一分钟学会怎么让chatGPT帮你写python代码(含使用地址)

    1、给定角色定位 2、提出要求 3、提出要求的细节 效果还是不错的,界面也还可以,简单的加减乘除运算都没有问题 1.现在加入就送内含5-18美元的 ChatGPT 开发者账号 2.外面卖888元的ChatGPT系列课程星球内免费看 3.不用魔法,直接使用 ChatGPT 4.大量 ChatGPT 相关帖子学习 5.可以晒自

    2024年02月02日
    浏览(12)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包