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

yizhihongxing

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日

相关文章

  • Java新手环境搭建 JDK8安装配置教程

    Java新手环境搭建 JDK8安装配置教程 为了学习和开发Java程序,需要安装和配置Java Development Kit(JDK)。在本文中,将介绍如何在Windows操作系统上安装和配置JDK 8,并配置环境变量。 步骤1: 下载JDK8 首先,需要从Oracle官方网站下载适合的JDK8版本。可以从以下链接下载JDK8文件: JDK8官方下载页面 …

    Java 2023年5月24日
    00
  • Java实现跳跃表的示例详解

    让我来为您详细讲解“Java实现跳跃表的示例详解”的完整攻略。 什么是跳跃表 跳跃表是一种特殊的数据结构,它能快速地在有序链表中进行查找、插入和删除等操作,其效率甚至可以比拟红黑树。 跳跃表通过概率分布来随机地确定新节点的层数,这样就可以在一定程度上减少查找时需要比较的节点数目,从而提高查找效率。同时,跳跃表还可以通过动态调整层数来保证其平衡性。 如何实现跳…

    Java 2023年5月18日
    00
  • 详细讲解Java中的main()方法

    详细讲解Java中的main()方法 什么是main()方法 在Java中,每个可执行程序都必须包含一个名为 main 的方法。main 方法是程序的入口点,是Java程序启动时执行的第一个方法。在Java中,main 方法被定义为 public static void main(String[] args)。这表示 main 方法是公共的(可以从任何地方访…

    Java 2023年5月23日
    00
  • Java Scala之面向对象

    Java Scala之面向对象:完整攻略 什么是面向对象 面向对象(Object Oriented Programming,简称OOP)是一种编程范式,主要思想是将数据和对数据的相关操作封装在一个单元中,形成对象。通过对对象的定义、组合和继承等机制实现程序的可扩展性、灵活性和可维护性。 面向对象的三大特征 封装(Encapsulation) 封装就是将程序中…

    Java 2023年5月26日
    00
  • 如何基于SpringSecurity的@PreAuthorize实现自定义权限校验方法

    下面是详细攻略。 1. SpringSecurity基本概念 SpringSecurity是基于Spring框架的安全认证和授权模块,可以为我们的应用提供强大的安全管理。在SpringSecurity中,每个用户都有一个唯一的用户名和一个密码,SpringSecurity会在用户登录时对这些信息进行校验,如果校验通过则允许用户进行下一步操作,否则拒绝用户进行…

    Java 2023年5月20日
    00
  • java中判断字段真实长度的实例(中文2个字符,英文1个字符)

    下面我将详细讲解如何在Java中判断字段真实长度,区分中文和英文字符长度的处理方式。 问题背景 在开发Web应用程序时,经常需要对表单输入的数据进行长度验证,例如用户名、密码、手机、邮箱等,但是不同的语言字符所占用的字节数是不同的,在判断字符长度时,如果不做特别处理,就会出现问题。 在Java中可以使用字符编码的方式来解决这个问题。 解决方案 1、使用Str…

    Java 2023年5月29日
    00
  • 基于java实现DFA算法代码实例

    关于“基于java实现DFA算法代码实例”的攻略,我会按照以下流程进行讲解: 1.了解DFA算法2.选择适合的编程环境3.编写DFA代码4.测试DFA代码 首先,我们来了解一下DFA算法(确定有限状态自动机算法)的概念和原理。DFA算法主要应用于文本匹配、编译器词法分析等方面。它是一种状态转移图的形式,其中有一个起始状态和若干个终止状态,通过状态转移,将一个…

    Java 2023年5月19日
    00
  • 教你用JAVA写文本编辑器(一)

    “教你用JAVA写文本编辑器(一)”这篇文章主要是为初学者介绍如何用JAVA语言编写一个简单的文本编辑器程序。整篇文章介绍了搭建开发环境、项目创建及代码实现等过程,并给出了一个简单的示例。下面是该攻略的详细内容: 搭建开发环境 在开始编写JAVA文本编辑器程序之前,我们需要先搭建好JAVA开发环境。这里我们用的是Eclipse(也可以使用其他的JAVA集成开…

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