Java Stream流的常见生成和操作方法总结

Java Stream流的常见生成和操作方法总结

生成Stream流的常见方式

1. 通过Collection接口生成

可以通过Collection接口提供的stream()和parallelStream()方法生成一个Stream或ParallelStream流:

List<String> list = Arrays.asList("apple", "banana", "orange");
Stream<String> stream = list.stream(); // 生成Stream流
Stream<String> parallelStream = list.parallelStream(); // 生成ParallelStream流

2. 通过数组生成

可以通过数组的静态方法Arrays.stream()生成一个Stream流:

int[] arr = {1, 2, 3, 4, 5};
IntStream stream = Arrays.stream(arr); // 生成IntStream流

3. 通过指定数据方式生成

可以通过静态方法Stream.of()和Arrays.stream()生成一个Stream流:

Stream<Integer> stream1 = Stream.of(1, 2, 3, 4, 5); // 生成Stream流
Stream<Integer> stream2 = Arrays.stream(new Integer[]{1, 2, 3, 4, 5}); // 生成Stream流

4. 通过生成函数方式生成

可以通过静态方法Stream.generate()和Stream.iterate()生成一个Stream流:

Stream<Integer> stream1 = Stream.generate(() -> new Random().nextInt(100)); // 生成无限个随机数的Stream流
Stream<Integer> stream2 = Stream.iterate(0, n -> n + 2).limit(5); // 生成0, 2, 4, 6, 8的Stream流

Stream流的常用操作

1. filter()方法

filter()方法使用一个Lambda表达式作为参数,筛选出符合条件的元素:

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
Stream<Integer> stream = list.stream();
Stream<Integer> result = stream.filter(i -> i % 2 == 0);
result.forEach(System.out::println); // 输出:2, 4

2. map()方法

map()方法使用一个Lambda表达式作为参数,将元素映射为一个新的元素:

List<String> list = Arrays.asList("apple", "banana", "orange");
Stream<String> stream = list.stream();
Stream<String> result = stream.map(s -> s.toUpperCase());
result.forEach(System.out::println); // 输出:APPLE, BANANA, ORANGE

3. distinct()方法

distinct()方法返回一个没有重复元素的Stream流:

List<String> list = Arrays.asList("apple", "banana", "orange", "apple");
Stream<String> stream = list.stream();
Stream<String> result = stream.distinct();
result.forEach(System.out::println); // 输出:apple, banana, orange

4. sorted()方法

sorted()方法将流中的元素按照自然顺序或者指定的Comparator排序:

List<Integer> list = Arrays.asList(3, 5, 1, 4, 2);
Stream<Integer> stream = list.stream();
Stream<Integer> result = stream.sorted();
result.forEach(System.out::println); // 输出:1, 2, 3, 4, 5

5. limit()方法和skip()方法

limit()方法返回一个由原Stream包含的前n个元素组成的新Stream;skip()方法返回一个并不包含原Stream的前n个元素的新Stream:

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
Stream<Integer> stream = list.stream();
Stream<Integer> result1 = stream.limit(3);
result1.forEach(System.out::println); // 输出:1, 2, 3

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
Stream<Integer> stream = list.stream();
Stream<Integer> result2 = stream.skip(2);
result2.forEach(System.out::println); // 输出:3, 4, 5

6. reduce()方法

reduce()方法可以将流中的元素依次归约,返回结果:

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
Stream<Integer> stream = list.stream();
Optional<Integer> result = stream.reduce((a, b) -> a + b);
System.out.println(result.get()); // 输出15

示例说明

示例1:使用Stream流的常见生成和操作

下面程序使用生成函数的方式生成Stream流, 对其中的偶数进行过滤(filter)和排序(sorted)操作, 最后输出结果:

import java.util.Random;
import java.util.stream.Stream;

public class StreamDemo {

    public static void main(String[] args) {
        Stream<Integer> stream = Stream.generate(() -> new Random().nextInt(100)).limit(10);
        Stream<Integer> result = stream.filter(i -> i % 2 == 0).sorted();
        result.forEach(System.out::println); // 输出:6, 16, 18, 26, 30, 56, 68, 84, 88, 92
    }
}

示例2:从文件中读取单词进行统计

下面示例读取指定文件(book.txt)中的单词, 对其进行统计后输出结果:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.Arrays;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class StreamDemo {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new FileReader("D:/book.txt"));
        Stream<String> words = br.lines().flatMap(line -> Arrays.stream(line.split("\\W+"))).filter(word -> word.length() > 0);
        Map<String, Long> freq = words.collect(Collectors.groupingBy(String::toLowerCase, Collectors.counting()));
        System.out.println(freq);
    }
}

程序将单词进行toLowerCase()操作, 统计其出现的数量并输出结果.

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java Stream流的常见生成和操作方法总结 - Python技术站

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

相关文章

  • 计算机网络面试问题集锦(附答案)

    以下是针对“计算机网络面试问题集锦(附答案)”的完整攻略。 1. 了解面试题目类型及基本知识点 首先,我们需要了解计算机网络面试题目的种类和计算机网络基本知识点。可能会包括以下几种类型的问题: 基础概念(如OSI七层模型,TCP/IP协议族等) 网络协议(如UDP,TCP,HTTP等的原理和应用场景) 网络编程(如socket编程,HTTP服务器搭建等) 网…

    Java 2023年5月20日
    00
  • Spark学习笔记之Spark SQL的具体使用

    Spark学习笔记之Spark SQL的具体使用 简介 Spark SQL是Spark提供的分布式SQL查询引擎,通过Spark SQL,我们可以使用SQL语法来查询非关系型数据、结构化数据、CSV文件等。Spark SQL目前支持Hive查询语法和Spark SQL语法,也允许用户进行自定义函数、聚合函数等操作。 安装 要使用Spark SQL,我们需要先…

    Java 2023年5月26日
    00
  • SpringBoot整合spring-data-jpa的方法

    下面是关于Spring Boot整合spring-data-jpa的方法的详细攻略: 1. 引入依赖 在pom.xml文件中,增加以下两个依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-st…

    Java 2023年5月20日
    00
  • ASP移动文件函数movefile权限不足的替代方法

    下面是详细的讲解和攻略: 问题描述 在使用ASP中的movefile函数移动文件时,有时候会出现“权限不足”的错误。这是因为movefile函数不支持跨盘符移动文件,如果目标路径与源路径不在同一个磁盘盘符下,则需要管理员权限才能执行该操作。在没有管理员权限的情况下,我们需要寻找其他方法来解决这个问题。 解决方法 使用FileSystemObject对象的Co…

    Java 2023年6月15日
    00
  • java中如何执行xshell命令

    Java中可以使用Runtime和Process类来执行xshell命令,下面是详细步骤: 1.创建Runtime对象使用Java中Runtime类创建一个Runtime对象,这个对象提供了执行操作系统命令的方法。 Runtime runtime = Runtime.getRuntime(); 2.调用exec方法通过Runtime对象调用exec方法,可以…

    Java 2023年5月26日
    00
  • Java Web开发之MD5加密用法分析

    Java Web开发之MD5加密用法分析 什么是MD5加密 MD5全称为“Message-Digest Algorithm 5”,是一种非常常见并且安全性较高的哈希算法。MD5算法的核心在于将任意长度的数据(消息)通过一个不可逆的算法变换成一个固定长度的、十六进制表示的字符串,称为消息摘要。这个摘要具有防篡改性、密钥敏感性和抗碰撞等特性。 MD5加密的应用场…

    Java 2023年5月19日
    00
  • 浅谈Java中FastJson的使用

    浅谈Java中FastJson的使用 什么是FastJson FastJson 是一个 Java 语言编写的高性能 JSON 处理器,但不仅仅是一个 JSON 库。它采用了一种名为 递归下降 的方式来实现 JSON 的解析,因此它的性能非常快。 在Java中,使用FastJson可以很方便地将java对象序列化与反序列化成json格式的字符串,支持按需解析,…

    Java 2023年5月26日
    00
  • shell脚本监控MySQL服务是否正常

    下面就详细说明如何编写一个shell脚本来监控MySQL服务是否正常。 1. 编写脚本 首先可以使用vim等编辑器创建一个名为mysql_monitor.sh的文件,并在开头添加如下内容: #!/bin/bash #指明使用bash解释器 MYSQL=`which mysql` #获取mysql命令路径 MYSQL_CONF=/etc/my.cnf #mys…

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