Java8新特性系列-Stream

By | 2022年2月13日

Streams in Java 8 with Examples

Java 1.8 版本引入了一个新概念来处理集合的对象,这个新概念被称为 Streams。

这个 Stream API 概念存在于 java util 包中,基本上它用于处理集合对象。

因此,在阅读 Stream API 时,大多数开发人员或程序员都会混淆 java.util 中的 Stream 和 java.io 包中的 Stream API 之间的区别。

存在于 java.util 中的 Streams 用于处理集合对象,而存在于 java.io 包中的 Streams 用于处理与文件相关的二进制和字符数据。

Stream API 与 Collection 的区别

我们知道,如果我们想将一组单独的对象表示为单个实体,那么我们使用 Collection。

此外,如果我们想处理 Collection 中的对象组,那么我们可以使用 Streams。

我们如何创建Strean对象

如果我们想创建一个 Stream 对象,那么我们可以使用 Collection 接口的 stream() 方法来创建它。

stream() 方法是 Java 1.8 版本中添加到 Collection 的默认方法。

default Stream stream();

以下是我们可以理解如何创建Stream对象的示例:

Stream streamObject = c.stream();

其中 c 是任何集合。

所以,到目前为止,我们了解到 Stream 是存在于 java.util.stream 包中的一个接口。 一旦我们有了流,我们就可以使用该流 API 处理该集合的对象。

我们可以在多少个阶段使用流处理集合对象?

答案是我们可以分两个阶段处理 Collection 对象,这两个阶段如下:

1、 配置
2、 加工处理
因此,让我们一一了解这两者。

1. 配置

当我们使用配置阶段来处理集合对象时,我们可以通过使用过滤机制或使用映射机制来配置对象。 下面是过滤和映射的描述。

filter
当我们想要配置过滤器时,我们可以使用 Stream 接口的 filter() 方法配置一个过滤器,以根据一些布尔条件从集合中过滤元素。

public Stream filter(Predicate<T> t)

因此 (Predicate t) 可以是布尔值函数或 lambda 表达式。

下面是关于我们如何使用过滤器的简要想法。

Stream s = c.stream();
Stream s1 = s.filter( i -> i%2==0);

因此,简单来说,我们可以说要根据一些布尔条件过滤集合中的元素,我们应该使用 filter() 方法。

Mapping

当我们想根据我们的要求为集合中存在的每个对象创建一个单独的新对象时,我们应该使用 Stream 接口的 map() 方法。

public Stream map( Function f);

这里的函数也可以是 lambda 表达式。

下面是关于我们如何使用地图的简要想法。

Stream s = c.stream();
Stream s1= s.map(i->i+10);

Collection 对象的配置完成后的下一步是什么?

因此,一旦完成 Collection 对象的配置,然后在此之后,我们可以使用多种方法来处理对象。

2. 加工处理

我们可以通过下面的几个方法进行加工处理:

  • 使用 collect() 方法进行处理。
  • 使用 count() 方法进行处理。
  • 使用 sort() 方法进行处理。
  • 使用 min() 和 max() 方法进行处理。
  • 使用 forEach() 方法进行处理。
  • 通过使用 toArray() 方法
  • 通过使用 Stream.of() 方法。

示例 1:使用 Stream 从列表中收集偶数的 Java 程序
下面是没有使用 Stream 的程序:

package com.streamapijava8;

import java.util.ArrayList;
import java.util.List;

public class CollectEvenNumberWithoutStream {

	public static void main(String[] args) {

		List<Integer> numberList = new ArrayList<>();
		for (int i = 1; i <= 10; i++) {
			numberList.add(i);
		}
		System.out.println(numberList);
		// [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

		List<Integer> secondNumberList = new ArrayList<>();
		for (Integer i1 : numberList) {
			if (i1 % 2 == 0) {
				secondNumberList.add(i1);
			}
		}
		System.out.println(secondNumberList);
		// [2, 4, 6, 8, 10]
	}
}
// 输出
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[2, 4, 6, 8, 10]

下面是使用 Java 1.8 版本的 Stream 概念的相同程序。

package com.streamapijava8;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class CollectEvenNumberWithStream {

   public static void main(String[] args) {

	List<Integer> numberList = new ArrayList<>();
	for (int i = 1; i <= 10; i++) {
		numberList.add(i);
	}
	System.out.println(numberList);
	// [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

        List<Integer> secondNumberList =
             numberList.stream().filter(i -> i % 2 == 0).collect(Collectors.toList());

	System.out.println(secondNumberList);
	// [2, 4, 6, 8, 10]
   }
}
// 输出
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[2, 4, 6, 8, 10]

示例 2:Stream 的 map() 和 collect() 方法

package com.streamapijava8;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class StreamMapAndCollectMethodExample {

	public static void main(String[] args) {

		List<String> nameList = new ArrayList<>();
		nameList.add("wiiliam son");
		nameList.add("virat");
		nameList.add("dhoni");
		nameList.add("smith");
		nameList.add("morgan");
		nameList.add("maxwell");
		System.out.println(nameList);
		// [wiiliam son, virat, dhoni, smith, morgan, maxwell]
		List<String> nameListInUpperCase = nameList.stream().map(s -> s.toUpperCase()).collect(Collectors.toList());
		System.out.println(nameListInUpperCase);
		// [WIILIAM SON, VIRAT, DHONI, SMITH, MORGAN, MAXWELL]

	}

}
// 输出
[wiiliam son, virat, dhoni, smith, morgan, maxwell]
[WIILIAM SON, VIRAT, DHONI, SMITH, MORGAN, MAXWELL]

示例 3:Stream 的 count() 方法

package com.streamapijava8;

import java.util.ArrayList;
import java.util.List;

public class StreamCountMethodExample {

	public static void main(String[] args) {

	List<String> nameList = new ArrayList<>();
	nameList.add("INDIA");
	nameList.add("RUSSIA");
	nameList.add("AMERICA");
	nameList.add("AUSTRALIA");
	nameList.add("ENGLAND");
	Long count = nameList.stream().filter(s -> s.length() > 5).count();
System.out.println("Total name with more than 5 length is " + count);

	}
}
// 输出
Total name with more than 5 length is 4

示例 4:Stream 的默认 sort() 方法

package com.streamapijava8;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class SortingUsingDefaultSortingMethodStream {

	public static void main(String[] args) {

		List<Integer> numbers = new ArrayList<>();
		numbers.add(14);
		numbers.add(4);
		numbers.add(11);
		numbers.add(78);
		numbers.add(2);
		numbers.add(99);
		numbers.add(7);
		System.out.println("Before Natural Sorting");
		System.out.println(numbers);
	numbers = numbers.stream().sorted().collect(Collectors.toList());
		System.out.println("After Natural Sorting");
		System.out.println(numbers);
	}
}
// 输出
Before Natural Sorting
[14, 4, 11, 78, 2, 99, 7]
After Natural Sorting
[2, 4, 7, 11, 14, 78, 99]

示例 5:Stream 的自定义 sort() 方法

package com.streamapijava8;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class SortingUsingCustomizedSortingMethodStream {

	public static void main(String[] args) {

		List<Integer> numbers = new ArrayList<>();
		numbers.add(14);
		numbers.add(4);
		numbers.add(11);
		numbers.add(78);
		numbers.add(2);
		numbers.add(99);
		numbers.add(7);
		System.out.println("Before Customized Sorting");
		System.out.println(numbers);
		System.out.println("After Customized Sorting");
		System.out.println("Sorting Bigger to smaller number");
                numbers = numbers.stream().sorted((s2, s1) -> 
                s1.compareTo(s2)).collect(Collectors.toList());
		System.out.println(numbers);
	}

}
// 输出
Before Customized Sorting
[14, 4, 11, 78, 2, 99, 7]
After Customized Sorting
Sorting Bigger to smaller number
[99, 78, 14, 11, 7, 4, 2]

示例 6:Stream 的 min() 和 max() 方法

package com.streamapijava8;

import java.util.ArrayList;
import java.util.List;

public class MinMaxUsingStreamMethod {

	public static void main(String[] args) {
		List<Integer> numbers = new ArrayList<>();
		numbers.add(14);
		numbers.add(4);
		numbers.add(11);
		numbers.add(78);
		numbers.add(2);
		numbers.add(99);
		numbers.add(7);
		System.out.println(numbers);
               //[14, 4, 11, 78, 2, 99, 7]

Integer minNum = numbers.stream().min((s1, s2) -> s1.compareTo(s2)).get();
	System.out.println("Minimum number value in list is " + minNum);
        //Minimum number value in list is 2
Integer maxNum = numbers.stream().max((s1, s2) -> s1.compareTo(s2)).get();
	System.out.println("Maximum number value is list is " + maxNum);
       //Maximum number value is list is 99

	}
}
// 输出
[14, 4, 11, 78, 2, 99, 7]
Minimun number value in list is 2
Maximun number value is list is 99

示例 7:Stream的 forEach() 方法

package com.streamapijava8;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

class ForEachMethodExample {
	public static void main(String[] args) {

		ArrayList<Integer> l1 = new ArrayList<Integer>();

		l1.add(0);
		l1.add(15);
		l1.add(10);
		l1.add(5);
		l1.add(30);
		l1.add(25);
		l1.add(20);
		System.out.println(l1);
		// [0, 15, 10, 5, 30, 25, 20]
List<Integer> l2 = l1.stream().map(i -> i+10).collect(Collectors.toList());
		l2.stream().forEach(i -> System.out.print(i + "  "));
		// 10 25 20 15 40 35 30 10
		System.out.println("");
		l2.stream().forEach(System.out::println);
	}
}
// 输出
[0, 15, 10, 5, 30, 25, 20]
10  25  20  15  40  35  30  
10
25
20
15
40
35
30

8:Stream的 toArray() 方法

package com.streamapijava8;

import java.util.ArrayList;
import java.util.List;

public class toArrayMethodExampleStream {

	public static void main(String[] args) {

		List<Integer> numberList = new ArrayList<>();
		numberList.add(10);
		numberList.add(4);
		numberList.add(2);
		numberList.add(8);
		numberList.add(1);
		numberList.add(15);
		System.out.println(numberList);
		// [10, 4, 2, 8, 1, 15]
		Integer numberArray[] = numberList.stream().toArray(Integer[]::new);
		for (Integer i1 : numberArray) {
			System.out.print(i1 + " ");// 10 4 2 8 1 15
		}
	}
}
// 输出
[10, 4, 2, 8, 1, 15]
10 4 2 8 1 15

示例9:Stream的 of() 方法

Stream 的 Stream.of() 方法应用于值组和数组。

package com.streamapijava8;

import java.util.stream.Stream;

public class StreamOfMethodExample {

	public static void main(String[] args) {
		Stream s = Stream.of(10, 100, 1000, 11111);
		s.forEach(System.out::println);
		Double[] d = { 1.1, 11.1, 21.1, 31.1 };
		Stream s1 = Stream.of(d);
		s1.forEach(System.out::println);

	}
}
// 输出
10
100
1000
11111
1.1
11.1
21.1
31.1