Java Stream 流

技术分享 ·

简介 Java Stram API是JDK8提供的一种新特性,支持对集合进行声明式的操作。 Stream操作 1.创建流 Collection下的 stream() 和 parallelStream() 方法 List<String> list = Arrays.asList("a", "b", "c"); Stre…

简介

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
  • Java