赞
踩
Java 8引入了Stream API,它提供了一种新的抽象,可以更方便地对集合进行操作和处理。
想深入了解Stream流的小伙伴可以看看我以前的源码文章:
1、 深度解析Java JDK 1.8中Stream流的源码实现:带你探寻数据流的奥秘_jdk中的流-CSDN博客
2、 Java流操作解析:深度剖析中间操作、终端操作与并行处理机制_流操作 中间操作有哪些-CSDN博客
Stream API允许我们以一种声明性的方式处理数据,支持函数式编程风格。
String流主要特性和用法:
stream()
方法或parallelStream()
方法来创建流。Arrays.stream(array)
方法。Stream.of()
、IntStream.range()
等。filter(Predicate)
:根据条件过滤流中的元素。map(Function)
:将流中的每个元素映射为另一个元素。sorted()
:对流进行排序。distinct()
:去除流中重复的元素。limit(long)
:限制流中元素的数量。forEach(Consumer)
:对流中的每个元素执行操作。collect(Collectors)
:将流元素归约和汇总成一个值,如List、Set、Map
等。reduce()
:归约操作,可以将流中的元素反复结合起来,得到一个值。min()
和max()
:找出流中的最小和最大值。count()
:返回流中元素的总数。anyMatch()
, allMatch()
, noneMatch()
:检查流中是否存在满足条件的元素。如何使用Java 8的Stream API来操作集合:
public static void main(String[] args) {
List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd", "", "jkl");
// 打印非空字符串的数量:使用`filter`方法过滤出非空字符串,然后使用`count`方法获取数量
long count = strings.stream()
.filter(string -> !string.isEmpty())
.count();
System.out.println("非空字符串数量:" + count);
// 打印非空字符串的列表:使用`filter`方法过滤出非空字符串,然后使用`collect(Collectors.toList())`将结果收集为List
List<String> filtered = strings.stream()
.filter(string -> !string.isEmpty())
.collect(Collectors.toList());
System.out.println("非空字符串列表:" + filtered);
// 使用逗号连接非空字符串:使用`filter`方法过滤出非空字符串,然后使用`collect(Collectors.joining(", "))`连接成一个字符串
String mergedString = strings.stream()
.filter(string -> !string.isEmpty())
.collect(Collectors.joining(", "));
System.out.println("连接后的字符串:" + mergedString);
// 获取最长的字符串:使用`max`方法找到最长的字符串,如果找不到则返回空字符串
String longestString = strings.stream()
.max((s1, s2) -> s1.length() - s2.length())
.orElse("");
System.out.println("最长的字符串:" + longestString);
}
IntStream
、LongStream
和DoubleStream
是基本类型的流,提供了对整数、长整数和双精度浮点数的高效处理。
IntStream
的元素类型为 int
:
range(int startInclusive, int endExclusive)
:创建一个范围在 [startInclusive, endExclusive)
内的 IntStream
。rangeClosed(int startInclusive, int endInclusive)
:创建一个范围在 [startInclusive, endInclusive]
内的 IntStream
。of(int... values)
:从一组整数值创建一个 IntStream
。sum()
:对流中的所有整数求和。average()
:计算流中所有整数的平均值。min()
和 max()
:找出流中的最小和最大值。forEach(IntConsumer action)
:对流中的每个整数执行指定操作。LongStream
的元素类型为 long
:
range(long startInclusive, long endExclusive)
:创建一个范围在 [startInclusive, endExclusive)
内的 LongStream
。rangeClosed(long startInclusive, long endInclusive)
:创建一个范围在 [startInclusive, endInclusive]
内的 LongStream
。of(long... values)
:从一组长整数值创建一个 LongStream
。sum()
:对流中的所有长整数求和。average()
:计算流中所有长整数的平均值。min()
和 max()
:找出流中的最小和最大值。forEach(LongConsumer action)
:对流中的每个长整数执行指定操作。DoubleStream
的元素类型为 double
:
of(double... values)
:从一组双精度浮点数值创建一个 DoubleStream
。range(double startInclusive, double endInclusive)
:创建一个在指定范围内的 DoubleStream
。sum()
:对流中的所有双精度浮点数求和。average()
:计算流中所有双精度浮点数的平均值。min()
和 max()
:找出流中的最小和最大值。forEach(DoubleConsumer action)
:对流中的每个双精度浮点数执行指定操作。使用 IntStream
、LongStream
和 DoubleStream
基本的操作:
public static void main(String[] args) {
// IntStream
IntStream.range(1, 5)
.forEach(System.out::print);
// 输出:1234
System.out.println();
int sum = IntStream.of(1, 2, 3, 4, 5)
.sum();
// 计算总和:15
System.out.println("Sum of integers: " + sum);
// LongStream
long max = LongStream.rangeClosed(1, 10)
.max()
.orElse(0);
// 找出最大值:10
System.out.println("Max of long integers: " + max);
// DoubleStream
double average = DoubleStream.of(1.5, 2.5, 3.5, 4.5)
.average()
.orElse(0.0);
// 计算平均值:3.0
System.out.println("Average of doubles: " + average);
}
收集器(Collectors)用于将流的元素累积到集合中,或者进行聚合操作。在使用流进行数据处理时,收集器是非常有用的工具,它们能够简化代码并提高效率。
常用的收集器及其用法:
toList()
List<String> list = stream.collect(Collectors.toList());
toSet()
Set<String> set = stream.collect(Collectors.toSet());
toMap()
Map<Integer, String> map = stream.collect(Collectors.toMap(String::length, Function.identity()));
joining()
String result = stream.collect(Collectors.joining(", "));
groupingBy()
Map<Integer, List<String>> groupedByLength = stream.collect(Collectors.groupingBy(String::length));
partitioningBy()
true/false
,值为满足条件的元素列表。Map<Boolean, List<String>> partitioned = stream.collect(Collectors.partitioningBy(s -> s.length() > 3));
summarizingInt() / summarizingDouble() / summarizingLong()
IntSummaryStatistics stats = stream.collect(Collectors.summarizingInt(String::length));
如何将一个字符串流收集成一个列表,并按长度分组:
public static void main(String[] args) {
List<String> words = Arrays.asList("apple", "banana", "grape", "pear", "orange");
// 将流中的元素收集到一个列表中
List<String> wordList = words.stream()
.collect(Collectors.toList());
System.out.println("List of words: " + wordList);
// 根据字符串长度分组
Map<Integer, List<String>> groupedByLength = words.stream()
.collect(Collectors.groupingBy(String::length));
System.out.println("Words grouped by length: " + groupedByLength);
}
智者的梦再美,也不如愚人实干的脚印
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。