Java Stream API 操作完全攻略:让你的代码更加出色 (三)

简介: Java Stream 是一种强大的数据处理工具,可以帮助开发人员快速高效地处理和转换数据流。使用 Stream 操作可以大大简化代码,使其更具可读性和可维护性,从而提高开发效率。本文将为您介绍 Java Stream 操作的所有方面,包括 groupingBy、groupingBy、joining、mapping 等操作,让你的代码行云流水,更加优雅。

前言
  Java Stream 是一种强大的数据处理工具,可以帮助开发人员快速高效地处理和转换数据流。使用 Stream 操作可以大大简化代码,使其更具可读性和可维护性,从而提高开发效率。本文将为您介绍 Java Stream 操作的所有方面,包括 groupingBy、groupingBy、joining、mapping 等操作,让你的代码行云流水,更加优雅。

groupingBy():按照指定条件对 Stream 中的元素进行分组。
partitioningBy():按照指定条件对 Stream 中的元素进行分区。
joining():将 Stream 中的元素连接成一个字符串。
mapping():根据指定的 Function 对 Stream 中的元素进行映射,并返回一个新的 Stream。
flatMapping():将每个元素映射为一个 Stream,然后将这些 Stream 连接成一个 Stream。
iterating():使用指定的种子值创建一个 Stream,并依次对每个元素进行指定的操作。
empty():返回一个空的 Stream。
of():根据指定的元素创建一个 Stream。
concat():将多个 Stream 连接成一个 Stream。
unordered():返回一个无序的 Stream。

示例

  1. 使用 groupingBy() 按照字符串长度对字符串列表进行分组

代码示例:
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class GroupingByExample {

public static void main(String[] args) {
    List<String> stringList = Arrays.asList("hello", "world", "java", "stream");

    Map<Integer, List<String>> result = stringList.stream()
            .collect(Collectors.groupingBy(String::length));

    System.out.println(result);
}

}
复制代码
输出结果:
{5=[hello, world], 4=[java], 6=[stream]}
复制代码
2.使用 partitioningBy() 将数字列表按照是否为偶数进行分区
代码示例:
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class PartitioningByExample {

public static void main(String[] args) {
    List<Integer> numberList = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

    Map<Boolean, List<Integer>> result = numberList.stream()
            .collect(Collectors.partitioningBy(n -> n % 2 == 0));

    System.out.println(result);
}

}
复制代码
输出结果:
{false=[1, 3, 5, 7, 9], true=[2, 4, 6, 8, 10]}
复制代码
3.使用 joining() 将字符串列表中的元素用逗号连接成一个字符串
代码示例:
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class JoiningByExample {

public static void main(String[] args) {
    List<String> stringList = Arrays.asList("hello", "world", "java", "stream");

    String result = stringList.stream()
            .collect(Collectors.joining(","));

    System.out.println(result);
}

}
复制代码
输出结果:
hello,world,java,stream
复制代码
4.使用 mapping() 将字符串列表中的元素转换为大写字母
代码示例:
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class MappingByExample {

public static void main(String[] args) {
    List<String> stringList = Arrays.asList("hello", "world", "java", "stream");

    List<String> result = stringList.stream()
            .map(String::toUpperCase)
            .collect(Collectors.toList());

    System.out.println(result);
}

}
复制代码
输出结果:
[HELLO, WORLD, JAVA, STREAM]
复制代码
5.使用 flatMapping() 将嵌套的字符串列表展平为一个字符串列表
代码示例:
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class FlatMappingByExample {

public static void main(String[] args) {
    List<List<String>> nestedList = Arrays.asList(
            Arrays.asList("hello", "world"),
            Arrays.asList("hello","java", "stream"));

    List<String> result = nestedList.stream()
            .flatMap(List::stream)
            .distinct()
            .collect(Collectors.toList());

    System.out.println(result);
}

}
复制代码
输出结果:
[hello, world, java, stream]
复制代码
6.使用 iterating() 生成斐波那契数列前 10 项
代码示例:
import java.util.stream.Stream;

public class IteratingByExample {

public static void main(String[] args) {
    Stream.iterate(new int[]{0, 1}, t -> new int[]{t[1], t[0] + t[1]})
            .limit(10)
            .map(t -> t[0])
            .forEach(System.out::println);
}

}
复制代码
输出结果:
0
1
1
2
3
5
8
13
21
34
复制代码
7.使用 empty() 使用空的 Stream
代码示例:
import java.util.stream.Stream;

public class EmptyStreamExample {

public static void main(String[] args) {
    Stream<String> emptyStream = Stream.empty();

    System.out.println(emptyStream.count());
}

}
复制代码
输出结果:
0
复制代码
8.使用 of() 创建包含一些字符串的 Stream
代码示例:
import java.util.stream.Stream;

public class OfStreamExample {

public static void main(String[] args) {
    Stream<String> stringStream = Stream.of("hello", "world", "java", "stream");

    stringStream.forEach(System.out::println);
}

}
复制代码
输出结果:
hello
world
java
stream
复制代码
9.使用 concat() 将两个字符串列表合并为一个列表
代码示例:
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;

public class ConcatStreamExample {

public static void main(String[] args) {
    List<String> list1 = Arrays.asList("hello", "world");
    List<String> list2 = Arrays.asList("java", "stream");

    Stream<String> stream1 = list1.stream();
    Stream<String> stream2 = list2.stream();

    List<String> result = Stream.concat(stream1, stream2)
            .collect(Collectors.toList());

    System.out.println(result);
}

}
复制代码
输出结果:
[hello, world, java, stream]
复制代码
10.使用 unordered() 对数字列表进行排序后,使用 unordered()返回一个无序的 Stream
代码示例:
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class UnorderedStreamExample {

public static void main(String[] args) {
    List<Integer> numberList = Arrays.asList(1, 3, 2, 4, 10, 6, 8, 7, 9, 6);

    List<Integer> result = numberList.stream()
            .sorted()
            .unordered()
            .collect(Collectors.toList());

    System.out.println(result);
}

}
复制代码
输出结果:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
复制代码
来个小坑

  感谢大佬看到这里,如果你看完觉得没问题,那么你需要反思一下了哦。好了我们可以在仔细地看看,示例10.unordered()的代码。
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class UnorderedStreamExample {

public static void main(String[] args) {
    List<Integer> numberList = Arrays.asList(1, 3, 2, 4, 10, 6, 8, 7, 9, 6);

    List<Integer> result = numberList.stream()
            .sorted()
            .unordered()
            .collect(Collectors.toList());

    System.out.println(result);
}

}
复制代码
输出结果:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
复制代码
  执行过程分析,首先输入了一个无序的流,然后使用sorted()对流进行排序,然后在使用unordered(),去除流的有序约束。然后输出为List,再进行打印出来。按理来说,输出的顺序应该是一个无序的,而不是有序的。

解答
  unordered()操作不会执行任何操作来显式地对流进行排序。它的作用是消除了流必须保持有序的约束,从而允许后续操作使用不必考虑排序的优化。
  对于顺序流,顺序的存在与否不会影响性能,只影响确定性。如果流是顺序的,则在相同的源上重复执行相同的流管道将产生相同的结果;如果是非顺序流,重复执行可能会产生不同的结果。
  unordered()操作,是消除了流必须保持有序的约束。并不会改变,流原有的顺序。对于并行流,放宽排序约束有时可以实现更高效的执行。在流有序时, 但用户不特别关心该顺序的情况下,使用 unordered() 明确地对流进行去除有序约束可以改善某些有状态或终端操作的并行性能。

相关文章
|
3天前
|
算法 Java API
如何使用Java开发获得淘宝商品描述API接口?
本文详细介绍如何使用Java开发调用淘宝商品描述API接口,涵盖从注册淘宝开放平台账号、阅读平台规则、创建应用并申请接口权限,到安装开发工具、配置开发环境、获取访问令牌,以及具体的Java代码实现和注意事项。通过遵循这些步骤,开发者可以高效地获取商品详情、描述及图片等信息,为项目和业务增添价值。
32 10
|
15天前
|
Java
java小工具util系列4:基础工具代码(Msg、PageResult、Response、常量、枚举)
java小工具util系列4:基础工具代码(Msg、PageResult、Response、常量、枚举)
43 24
|
11天前
|
Java 编译器 数据库
Java 中的注解(Annotations):代码中的 “元数据” 魔法
Java注解是代码中的“元数据”标签,不直接参与业务逻辑,但在编译或运行时提供重要信息。本文介绍了注解的基础语法、内置注解的应用场景,以及如何自定义注解和结合AOP技术实现方法执行日志记录,展示了注解在提升代码质量、简化开发流程和增强程序功能方面的强大作用。
41 5
|
11天前
|
存储 算法 Java
Java 内存管理与优化:掌控堆与栈,雕琢高效代码
Java内存管理与优化是提升程序性能的关键。掌握堆与栈的运作机制,学习如何有效管理内存资源,雕琢出更加高效的代码,是每个Java开发者必备的技能。
39 5
|
11天前
|
存储 Java 数据挖掘
Java 8 新特性之 Stream API:函数式编程风格的数据处理范式
Java 8 引入的 Stream API 提供了一种新的数据处理方式,支持函数式编程风格,能够高效、简洁地处理集合数据,实现过滤、映射、聚合等操作。
30 5
|
11天前
|
Java API 开发者
Java中的Lambda表达式与Stream API的协同作用
在本文中,我们将探讨Java 8引入的Lambda表达式和Stream API如何改变我们处理集合和数组的方式。Lambda表达式提供了一种简洁的方法来表达代码块,而Stream API则允许我们对数据流进行高级操作,如过滤、映射和归约。通过结合使用这两种技术,我们可以以声明式的方式编写更简洁、更易于理解和维护的代码。本文将介绍Lambda表达式和Stream API的基本概念,并通过示例展示它们在实际项目中的应用。
|
13天前
|
Java API 开发者
Java中的Lambda表达式:简洁代码的利器####
本文探讨了Java中Lambda表达式的概念、用途及其在简化代码和提高开发效率方面的显著作用。通过具体实例,展示了Lambda表达式如何在Java 8及更高版本中替代传统的匿名内部类,使代码更加简洁易读。文章还简要介绍了Lambda表达式的语法和常见用法,帮助开发者更好地理解和应用这一强大的工具。 ####
|
2天前
|
Rust 安全 Java
Java Stream 使用指南
本文介绍了Java中Stream流的使用方法,包括如何创建Stream流、中间操作(如map、filter、sorted等)和终结操作(如collect、forEach等)。此外,还讲解了并行流的概念及其可能带来的线程安全问题,并给出了示例代码。
|
10天前
|
安全 Java API
Java中的Lambda表达式:简化代码的现代魔法
在Java 8的发布中,Lambda表达式的引入无疑是一场编程范式的革命。它不仅让代码变得更加简洁,还使得函数式编程在Java中成为可能。本文将深入探讨Lambda表达式如何改变我们编写和维护Java代码的方式,以及它是如何提升我们编码效率的。
|
13天前
|
安全 Java API
Java中的Lambda表达式与Stream API的高效结合####
探索Java编程中Lambda表达式与Stream API如何携手并进,提升数据处理效率,实现代码简洁性与功能性的双重飞跃。 ####
23 0