Java Stream是Java 8中添加的新特性,它提供了一種全新的、優雅的方式來操作數據集合。這種方式可以讓我們避免使用迭代器等重複性代碼,而是使用更加易於理解和維護的函數式編程的方式來處理數據。Java Stream能夠對集合進行過濾、排序、映射等操作,同時還可以支持多線程處理。本文將介紹Java Stream的使用方法,並展示如何使用Java Stream來優雅地處理數據。
一、Stream的基本概念
Stream是一個用於處理集合的標準化操作的概念。其本質是對數據源的一系列操作封裝成一條流水線,類似於一條流水線上的清洗、加工、包裝等工作,最終生成一個處理完成的結果。Stream表示數據流,和集合使用類似,但在某些情況下,Stream更勝一籌。Stream只是一個聲明式的概念,不會改變數據源的元素,產生的結果也僅限於終止操作。使用Stream,可以大大減少程序的複雜性和代碼冗餘。
1.1 Stream的初步創建方法
Stream可以有兩種創建方式,一種是通過集合或數組的Stream()方法進行創建,一種是通過Stream.of()方法傳入一系列元素進行創建。Stream可以看成是一個元素的集合,每次對元素集合的操作都會返回一個新的元素集合。下面是通過數組和集合創建Stream的示例:
public class StreamTest {
public static void main(String[] args) {
// 通過數組創建Stream
int[] nums = {1, 3, 5, 7, 9};
IntStream stream = Arrays.stream(nums);
System.out.println("通過數組創建Stream");
stream.forEach(System.out::println);
// 通過集合創建Stream
List words = new ArrayList();
words.add("mina");
words.add("momo");
words.add("sana");
Stream stream1 = words.stream();
System.out.println("通過集合創建Stream");
stream1.forEach(System.out::println);
}
}
1.2 Stream的中間操作方法
Stream提供了多種中間操作方法,這些方法可以看做是在Stream生成的元素集合上的一些處理操作,中間操作方法執行完畢後,仍可以執行後續的操作,這些方法不生成真正的處理結果,直到執行終止操作才會生成。下面是一些常見的中間操作方法:
filter方法
filter方法可以接收一個Predicate參數,用於對元素集合進行過濾操作,只有符合條件的元素才能進入下一步操作。下面的代碼片段展示了使用filter方法過濾出大於3的數字:
// Filer示例
List list = Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9).filter(num -> num > 3).collect(Collectors.toList());
System.out.println("Filter示例");
list.forEach(System.out::println); //輸出4,5,6,7,8,9
map方法
map方法可以接收一個Function參數,用於對元素集合進行映射操作,返回一個新的元素集合。下面的代碼片段展示了使用map方法將字符串轉成大寫形式:
// Map示例
List list = Stream.of("hello", "world", "mina").map(String::toUpperCase).collect(Collectors.toList());
System.out.println("Map示例");
list.forEach(System.out::println); //輸出HELLO,WORLD,MINA
flatMap方法
flatMap方法可以接收一個Function參數,用於將多個元素集合合併成一個新的元素集合。下面的代碼片段展示了使用flatMap方法將多個集合合併成一個新的集合:
// FlatMap示例
List list1 = Arrays.asList(1, 2, 3);
List list2 = Arrays.asList(4, 5, 6);
List list3 = Arrays.asList(7, 8, 9);
List list = Stream.of(list1, list2, list3).flatMap(Collection::stream).collect(Collectors.toList());
System.out.println("FlatMap示例");
list.forEach(System.out::println); //輸出1,2,3,4,5,6,7,8,9
distinct方法
distinct方法用於去重,對於某些數據處理場景來說十分有用。下面的代碼片段展示了對元素集合進行去重操作的方法:
// Distinct示例
List list = Stream.of(1, 2, 3, 2, 1, 5, 4, 3).distinct().collect(Collectors.toList());
System.out.println("Distinct示例");
list.forEach(System.out::println); //輸出1,2,3,5,4
1.3 Stream的結束操作方法
結束操作方法是對元素集合進行終止處理的方法,這些方法執行後會生成真正的處理結果。Stream提供了多種結束操作方法,最常見的是forEach和collect方法。
forEach方法
forEach方法可以對元素集合進行遍歷操作,並對每個元素執行指定的操作。下面的代碼片段展示了使用forEach方法打印元素集合中的所有元素:
// ForEach示例
Stream.of("apple", "banana", "orange").forEach(System.out::println);
collect方法
collect方法可以將Stream的處理結果收集到一個集合中。下面的代碼片段展示了使用collect方法將Stream處理結果收集到一個列表中:
// Collect示例
List list = Stream.of("apple", "banana", "orange").collect(Collectors.toList());
System.out.println("Collect示例");
list.forEach(System.out::println); //輸出apple,banana,orange
二、Stream的優雅操作數據
Stream的特點就在於它提供了一種更加簡潔、易於理解和維護的方式操作數據。在實際使用中,Stream可以用於各種數據集合的操作,無論是數組、集合還是數據庫操作,Stream都可以通過優雅的方式實現,從而使程序變得更加高效、簡潔。
2.1 Stream在集合操作中的應用
Stream可以與集合操作結合使用,實現各種集合的處理操作,使集合的操作變得更加簡單、高效。下面是一些在集合操作中使用Stream的常用方法示例:
filter方法實現集合過濾
集合過濾操作是Stream在實際應用中最常用的操作之一。可以使用filter方法實現簡單的過濾操作。下面的代碼展示了如何使用filter方法過濾集合中的元素:
public class StreamTest {
public static void main(String[] args) {
List list = new ArrayList();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
list.add(6);
// 過濾出大於3的元素
List filteredList = list.stream().filter(num -> num > 3).collect(Collectors.toList());
System.out.println("Filter示例");
filteredList.forEach(System.out::println); //輸出4,5,6
}
}
map方法實現集合轉換
集合轉換操作是Stream在實際應用中的另一種常見操作,可以使用map方法將集合中的元素轉換為另一種類型的元素,達到轉換集合類型的效果。下面的代碼展示了如何使用map方法將集合中的元素整數轉換成字符串形式:
public class StreamTest {
public static void main(String[] args) {
List list = new ArrayList();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
list.add(6);
// 將元素轉換為字符串並收集為一個List
List strList = list.stream().map(num -> num.toString()).collect(Collectors.toList());
System.out.println("Map示例");
strList.forEach(System.out::println); //輸出1,2,3,4,5,6
}
}
reduce方法實現集合歸約
集合歸約操作是Stream中比較複雜的一種操作,可以使用reduce方法將集合中的元素歸約成一個值。下面的代碼展示了如何使用reduce方法將集合中的元素相加:
public class StreamTest {
public static void main(String[] args) {
List list = new ArrayList();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
list.add(6);
Optional<Integer> sum = list.stream().reduce((num1, num2) -> num1 + num2);
System.out.println("Reduce示例");
System.out.println(sum.get()); //輸出21
}
}
2.2 Stream在數據庫操作中的應用
應用程序在處理大型數據集時經常需要進行數據庫操作。在Java中,我們通常使用JDBC來操作數據庫。使用Stream可以更加優雅地處理數據庫數據。下面是一個使用Stream進行數據庫操作的示例:
// 數據庫Student表有id,name,age三個字段
public class StreamTest {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC";
String name = "root";
String password = "root";
// 創建數據源
DataSource dataSource = null;
try {
dataSource = DruidDataSourceFactory.createDataSource(new Properties() {{
setProperty("driverClassName", "com.mysql.jdbc.Driver");
setProperty("url", url);
setProperty("username", name);
setProperty("password", password);
}});
} catch (Exception e) {
e.printStackTrace();
}
// 從數據庫中查詢結果並使用Stream對結果進行處理
try (Connection conn = dataSource.getConnection()) {
PreparedStatement prepStatement = conn.prepareStatement("SELECT * FROM Student");
ResultSet resultSet = prepStatement.executeQuery();
List<Student> students = new ArrayList();
while (resultSet.next()) {
Student student = new Student();
student.setId(resultSet.getInt("id"));
student.setName(resultSet.getString("name"));
student.setAge(resultSet.getInt("age"));
students.add(student);
}
// 使用Stream從查詢結果中過濾出年齡大於18歲的學生
List<String> names = students.stream().filter(student -> student.getAge() > 18).map(Student::getName).collect(Collectors.toList());
System.out.println("JDBC + Stream示例");
names.forEach(System.out::println); //輸出年齡大於18歲的學生姓名列表
} catch (SQLException e) {
e.printStackTrace();
}
}
}
// Student類
public class Student {
private Integer id;
private String name;
private Integer age;
// TODO: Setter & Getter方法
}
三、總結
Stream是一種全新的、優雅的方式來操作數據集合,相比於傳統的操作方式,Stream擁有更好的可讀性、可維護性和性能。Stream可以用於處理各種類型的數據集合,包括數組、集合和數據庫中的數據。在實際應用中,Stream可以提高代碼的可讀性、可維護性和代碼的重用性,從而提高開發的效率。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/293050.html