一文带你深入了解Java8 Stream流式编程

一文带你深入了解Java8 Stream流式编程

什么是Java 8 Stream

Java 8中引入了Stream API,通过Stream API,处理集合数据更加简单,更加高效。Stream API就如同一个迭代器(Iterator)一样,单向处理数据流并生成处理结果。

Stream接口可以让我们完成下面的任务:

  • 集合类型,比如 List,Set,甚至 Map 等等都可以做为 Stream 的数据源。
  • 数据处理操作,包括 filter,map,reduce,find,match ,排序等等。
  • 处理结果可以是 Stream类型,也可以是其他集合类型,比如 List,Set 或 Map等。

最基本使用

下面是一个最基本的Stream使用例子:

List<String> list = new ArrayList<>();
list.add("apple");
list.add("banana");
list.add("cherry");
list.add("date");
list.add("grape");

list.stream()
    .filter(e -> e.startsWith("a"))
    .map(String::toUpperCase)
    .forEach(System.out::println); // 输出:APPLE

在这个例子中,我们创建了一个String类型的List,通过stream()方法获取数据流,使用filter()方法对数据流进行过滤,使用map()方法对过滤后的结果进行转换,使用forEach()方法进行输出。

中间操作

通常,Stream操作会分成两种:中间操作和最终操作。中间操作会返回一个新的Stream类型对象,所以支持链式调用,常用的中间操作有:

filter

filter方法可以用一个谓词来过滤出所有符合谓词的元素,比如下面这个例子:

Stream<Integer> numbers = Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
Stream<Integer> evenNumbers = numbers.filter(n -> n % 2 == 0);
evenNumbers.forEach(System.out::println); // 输出:2 4 6 8 10

map

map方法可以用一个函数转换流中的每个元素,比如下面这个例子:

Stream<String> stream = Stream.of("java", "is", "cool");
Stream<String> upperStream = stream.map(String::toUpperCase);
upperStream.forEach(System.out::println); // 输出:JAVA IS COOL

flatMap

flatMap方法可以让我们将一个流中的内容映射为其他的Stream,将多个Stream中的数据合并到同一个Stream中,比如下面这个例子:

Stream<List<Integer>> stream = Stream.of(
        Arrays.asList(1, 2),
        Arrays.asList(3, 4, 5),
        Arrays.asList(6, 7, 8, 9)
);
Stream<Integer> flatStream = stream.flatMap(t -> t.stream());
flatStream.forEach(System.out::println); // 输出:1 2 3 4 5 6 7 8 9

sorted

sorted方法可以用来对流进行排序,比如下面这个例子:

Stream<String> stream = Stream.of("orange", "banana", "apple");
Stream<String> sortedStream = stream.sorted();
sortedStream.forEach(System.out::println); // 输出:apple banana orange

peek

peek方法可以用于调试Stream的中间操作结果,比如下面这个例子:

Stream<String> stream = Stream.of("apple", "banana", "cherry");
Stream<String> peekStream = stream.peek(System.out::println);
peekStream.forEach(System.out::println); // 输出:apple banana cherry

最终操作

最终操作会触发Stream的处理,常用的最终操作有:

forEach

forEach操作可以对每个元素进行处理,比如下面这个例子:

Stream.of(1, 2, 3, 4, 5)
        .filter(x -> x > 2)
        .forEach(System.out::println); // 输出:3 4 5

count

count操作可以统计Stream流长度,比如下面这个例子:

long count = Stream.of("apple", "banana", "cherry").count();
System.out.println(count); // 输出:3

toArray

toArray操作可以将Stream转化为一个数组,比如下面这个例子:

Stream<String> stream = Stream.of("apple", "banana", "cherry");
String[] array = stream.toArray(String[]::new);
System.out.println(Arrays.toString(array)); // 输出:[apple, banana, cherry]

reduce

reduce操作可以将流缩减为一个单独的结果,比如下面这个例子:

Optional<Integer> result = Stream.of(1, 2, 3).reduce((x, y) -> x + y);
System.out.println(result.get()); // 输出:6

collect

collect操作可以将Stream输出为集合,比如下面这个例子:

Stream<Integer> stream = Stream.of(1, 2, 3);
List<Integer> list = stream.collect(Collectors.toList());
System.out.println(list); // 输出:[1, 2, 3]

示例

下面是一个示例,通过Stream实现对一个List的排序和输出:

List<Person> persons = Arrays.asList(
        new Person("Tom", 10),
        new Person("Jerry", 20),
        new Person("Mike", 30),
        new Person("Joey", 40)
);

List<Person> sortedPersons = persons.stream()
        .sorted(Comparator.comparing(Person::getAge))
        .collect(Collectors.toList());

sortedPersons.forEach(System.out::println);

输出结果为:

Person{name='Tom', age=10}
Person{name='Jerry', age=20}
Person{name='Mike', age=30}
Person{name='Joey', age=40}

通过sort()方法可以排序List,通过Collectors.toList()方法可以将Stream转化为List。

阅读剩余 71%

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:一文带你深入了解Java8 Stream流式编程 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • springmvc整合freemarker配置的详细步骤

    下面是springmvc整合freemarker配置的详细步骤: 1.添加maven依赖 <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version&gt…

    Java 2023年5月19日
    00
  • javascript实现去除HTML标签的方法

    当我们需要从HTML代码中提取纯文本时,通常需要先去除HTML标签,这时候就需要用到JavaScript实现去除HTML标签的方法。下面就是具体的攻略: 1. 使用正则表达式 正则表达式是匹配模式,可以用来搜索和替换文本。可以使用正则表达式替换HTML标签而不会影响文本内容。 // 定义一个函数用于去除HTML标签 function removeTags(t…

    Java 2023年6月15日
    00
  • 基于Java解决华为机试实现密码截取

    我们来详细讲解如何基于Java解决华为机试实现密码截取的问题。 首先,我们需要了解题目的具体要求和背景说明。根据题目描述,我们需要从一个给定的字符串中截取连续的若干个字符,使得这些字符形成的子串在指定的字符串中出现的次数最多。其中,只允许删除掉原字符串中的某些字符,不能增加字符。这个问题可以用动态规划(Dynamic Programming)的思路来解决。 …

    Java 2023年5月19日
    00
  • JSP的login程序代码

    下面我就来详细讲解一下“JSP的login程序代码”的完整攻略。 首先,我们需要明确对于一个login程序代码需要实现的功能是什么:用户输入用户名和密码,验证用户名和密码是否正确,如果正确就跳转到用户的主页,如果不正确则给出提示并重新输入。因此,我们需要实现以下几个步骤: 创建login页面,让用户输入用户名和密码。在这里我们可以使用HTML语言来实现,代码…

    Java 2023年6月15日
    00
  • java使用正则表达式查找包含的字符串示例

    关于Java使用正则表达式查找包含的字符串示例,可以按照以下步骤进行: 步骤一:创建Pattern对象 为了使用正则表达式,需要首先创建一个Pattern对象。可以使用Pattern类提供的静态方法compile()来实现,如下所示: Pattern pattern = Pattern.compile("要查找的正则表达式"); 正则表达…

    Java 2023年5月27日
    00
  • 深入浅析Centos 7系统的Tomcat服务器

    深入浅析Centos 7系统的Tomcat服务器 简介 Tomcat 是 Apache 软件基金会(Apache Software Foundation)的一款开源的 Java Servlet 容器,也是一个标准的 JSP 容器。 本文将分步讲解如何在 Centos 7 系统上安装和配置 Tomcat 服务器,以及如何在 Tomcat 中部署网站应用。 安装…

    Java 2023年5月19日
    00
  • 地牢之魂怎么放技能_地牢之魂按键操作具体说明

    下面是《地牢之魂》放技能和按键操作的具体说明攻略。 地牢之魂怎么放技能 在《地牢之魂》中,放技能有两种方式:一种是通过快捷键直接放出,另一种是通过按住魔法键再释放。 通过快捷键放技能 打开游戏设置(左下角菜单中),进入“控制”选项卡 找到“技能”选项 选择要设置的技能,并在“快捷键”一栏中设置对应的键位 在游戏中按下设置的快捷键即可放出技能 注:不同职业和不…

    Java 2023年6月15日
    00
  • SpringBoot使用Feign调用其他服务接口

    下面是SpringBoot使用Feign调用其他服务接口的完整攻略。 Feign是什么? Feign是一种声明式Web服务客户端,它使得编写Web服务客户端变得更加容易。使用Feign,只需要定义服务接口并注解,Feign就会自动生成实现。提供了多种注解,比如@FeignClient、@RequestMapping等,使得我们可以快速定义和测试Web服务客户…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部