Java8Stream優雅操作數據

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-tw/n/293050.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-25 18:38
下一篇 2024-12-25 18:38

相關推薦

  • Python讀取CSV數據畫散點圖

    本文將從以下方面詳細闡述Python讀取CSV文件並畫出散點圖的方法: 一、CSV文件介紹 CSV(Comma-Separated Values)即逗號分隔值,是一種存儲表格數據的…

    編程 2025-04-29
  • Python棧操作用法介紹

    如果你是一位Python開發工程師,那麼你必須掌握Python中的棧操作。在Python中,棧是一個容器,提供後進先出(LIFO)的原則。這篇文章將通過多個方面詳細地闡述Pytho…

    編程 2025-04-29
  • Python中讀入csv文件數據的方法用法介紹

    csv是一種常見的數據格式,通常用於存儲小型數據集。Python作為一種廣泛流行的編程語言,內置了許多操作csv文件的庫。本文將從多個方面詳細介紹Python讀入csv文件的方法。…

    編程 2025-04-29
  • 如何用Python統計列表中各數據的方差和標準差

    本文將從多個方面闡述如何使用Python統計列表中各數據的方差和標準差, 並給出詳細的代碼示例。 一、什麼是方差和標準差 方差是衡量數據變異程度的統計指標,它是每個數據值和該數據值…

    編程 2025-04-29
  • Python多線程讀取數據

    本文將詳細介紹多線程讀取數據在Python中的實現方法以及相關知識點。 一、線程和多線程 線程是操作系統調度的最小單位。單線程程序只有一個線程,按照程序從上到下的順序逐行執行。而多…

    編程 2025-04-29
  • Python兩張表數據匹配

    本篇文章將詳細闡述如何使用Python將兩張表格中的數據匹配。以下是具體的解決方法。 一、數據匹配的概念 在生活和工作中,我們常常需要對多組數據進行比對和匹配。在數據量較小的情況下…

    編程 2025-04-29
  • Python操作數組

    本文將從多個方面詳細介紹如何使用Python操作5個數組成的列表。 一、數組的定義 數組是一種用於存儲相同類型數據的數據結構。Python中的數組是通過列表來實現的,列表中可以存放…

    編程 2025-04-29
  • Python爬取公交數據

    本文將從以下幾個方面詳細闡述python爬取公交數據的方法: 一、準備工作 1、安裝相關庫 import requests from bs4 import BeautifulSou…

    編程 2025-04-29
  • Python數據標準差標準化

    本文將為大家詳細講述Python中的數據標準差標準化,以及涉及到的相關知識。 一、什麼是數據標準差標準化 數據標準差標準化是數據處理中的一種方法,通過對數據進行標準差標準化可以將不…

    編程 2025-04-29
  • 如何使用Python讀取CSV數據

    在數據分析、數據挖掘和機器學習等領域,CSV文件是一種非常常見的文件格式。Python作為一種廣泛使用的編程語言,也提供了方便易用的CSV讀取庫。本文將介紹如何使用Python讀取…

    編程 2025-04-29

發表回復

登錄後才能評論