简介
Java Stram API是JDK8提供的一种新特性,支持对集合进行声明式的操作。
Stream操作
1.创建流
- Collection下的 stream() 和 parallelStream() 方法
List<String> list = Arrays.asList("a", "b", "c");
Stream<String> stream = list.stream(); //串行流
Stream<String> parallelStream = list.parallelStream(); //并行流
- Arrays 中的 stream() 方法,将数组转成流
String[] array = {"a", "b", "c"};
Stream<String> stream = Arrays.stream(array);
- Stream中的静态方法 of()、iterate()、generate()
Stream<Integer> stream = Stream.of(1,2,3,4,5,6);
stream.forEach(System.out::println);
// 输出:1 2 3 4 5 6
Stream<Integer> stream2 = Stream.iterate(0, (x) -> x + 2).limit(6);
stream2.forEach(System.out::println);
// 输出:0 2 4 6 8 10
Stream<Double> stream3 = Stream.generate(Math::random).limit(2);
stream3.forEach(System.out::println);
// 输出:两个随机数
2.中间操作
filter:过滤流中的元素(只保留返回值为true的项)
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
List<Integer> evenNumbers = numbers.stream()
.filter(n -> n > 3)
.collect(Collectors.toList());
System.out.println(evenNumbers); // 输出:[4, 5, 6]
limit:限制流的大小(获取前n个元素)
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
List<Integer> evenNumbers = numbers.stream()
.limit(2)
.collect(Collectors.toList());
System.out.println(evenNumbers); // 输出:[1, 2]
skip:跳过流中前n个元素
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
List<Integer> skippedNumbers = numbers.stream()
.skip(3)
.collect(Collectors.toList());
System.out.println(skippedNumbers); // 输出 [4, 5, 6, 7, 8, 9]
distinct:去重
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 1, 2, 3, 4);
List<Integer> distinctNumbers = numbers.stream()
.distinct()
.collect(Collectors.toList());
System.out.println(distinctNumbers); // 输出 [1, 2, 3, 4]
map:转换元素
List<String> str = Arrays.asList("HELLO","WORLD");
List<String> toLowerCaseStr = str.stream()
.map(String::toLowerCase)
.collect(Collectors.toList());
System.out.println(toLowerCaseStr); // 输出 [hello, world]
flatMap:将流中元素转换为另一个流,最后合并为一个流
List<Pair<String, List<String>>> pairs = Arrays.asList(
new Pair<>("example1", Arrays.asList("hello", "world")),
new Pair<>("example2", Arrays.asList("你好", "世界"))
);
List<String> words = pairs.stream()
.flatMap(pair -> pair.getValue().stream())
.collect(Collectors.toList());
System.out.println(words); // 输出 [hello, world, 你好, 世界]
mapToInt/Long/Double:与map差不多,只是将其转为基本类型。
flatMapToInt/Long/Double:与flatMap差不多,只是将其转为基本类型。
sorted:对元素进行自然排序;sorted(Comparator com):对元素进行定制排序
List<Integer> numbers = Arrays.asList(0, 1, 1, 2, 2, 1);
List<Integer> sortedNumbers = numbers.stream()
.sorted() // 自然排序
.collect(Collectors.toList());
System.out.println(sortedNumbers); // 输出 [0, 1, 1, 1, 2, 2]
List<Integer> reverseSortedNumbers = numbers.stream()
.sorted(Comparator.reverseOrder()) // 倒序排序
.collect(Collectors.toList());
System.out.println(reverseSortedNumbers); // 输出 [2, 2, 1, 1, 1, 0]
peek:主要用于调试,允许无修改的查看流中的元素。
List<String> words = Arrays.asList("hello", "world");
List<String> upperCaseWords = words.stream()
.peek(System.out::println) // 打印每个元素
.map(String::toUpperCase)
.collect(Collectors.toList());
3.终端操作
foreach:遍历每个元素,对每个元素执行操作。
List<String> words = Arrays.asList("hello", "world");
words.forEach(System.out::println); // 输出 hello world
collect:将流中元素转换为另一种数据结构。
List<String> words = Arrays.asList("hello", "world");
String string = words.stream().collect(Collectors.joining(",")); // 输出 hello,world
System.out.println(string);
List<String> list = words.stream().collect(Collectors.toList()); // 转换为list
Map<String, String> map = words.stream().collect(Collectors.toMap(word -> word, word ->word)); // 转换为map
Set<String> set = words.stream().collect(Collectors.toSet()); // 转换为set
count:返回流中元素总个数。
List<String> words = Arrays.asList("hello", "world");
long count = words.stream().count();
System.out.println(count); // 输出2
max:返回流中元素最大值;min:返回流中元素最小值。
List<Integer> numbers = Arrays.asList(0, 1, 2, 3, 4, 5);
Optional<Integer> max = numbers.stream().max(Integer::compare);
max.ifPresent(System.out::println); // 输出最大值5
Optional<Integer> min = numbers.stream().min(Integer::compare);
min.ifPresent(System.out::println); // 输出最小值0
findFirst:返回流中第一个元素;findAny:返回流中任一元素。
List<Integer> numbers = Arrays.asList(0, 1, 2, 3, 4, 5);
Optional<Integer> first = numbers.stream().findFirst();
first.ifPresent(System.out::println); // 输出第一个元素0
Optional<Integer> any = numbers.parallelStream().findAny();
any.ifPresent(System.out::println); // 输出随机元素
allMatch:检查流中每个元素是否都符合制定的逻辑。
List<Integer> numbers = Arrays.asList(0, 1, 2, 3, 4, 5);
boolean b1 = numbers.stream().allMatch(number -> number > 0);
System.out.println(b1); // 输出false
boolean b2 = numbers.stream().allMatch(number -> number > -1);
System.out.println(b2); // 输出true
anyMatch:检查流中是否存在元素符合制定的逻辑。
List<Integer> numbers = Arrays.asList(0, 1, 2, 3, 4, 5);
boolean b1 = numbers.stream().anyMatch(number -> number > 0);
System.out.println(b1); // 输出true
boolean b2 = numbers.stream().allMatch(number -> number > 5);
System.out.println(b2); // 输出false
noneMatch:检查流中每个元素是否都不符合制定的逻辑。
List<Integer> numbers = Arrays.asList(0, 1, 2, 3, 4, 5);
boolean b1 = numbers.stream().noneMatch(number -> number > 0);
System.out.println(b1); // 输出false
boolean b2 = numbers.stream().noneMatch(number -> number > 5);
System.out.println(b2); // 输出true