.stream().map詳解

隨着Java 8的發布,Lambda表達式和Stream API成為了Java應用程序開發的新標準,其中Stream API是所有新功能中最引人注目的。Stream API提供了一種流式編程模型,這種模型便於處理數據集合,尤其是Big Data。在Stream API中,.stream().map是最常見的用法之一,這篇文章將詳細介紹.map的用法及相關問題。

一、streammap方法

在Java 8中,Stream API是Java API提供的一種新的API,用於處理集合類數據,它不同於常見的操作List,而是允許您從數據流中過濾,映射和歸納數據。.stream()方法將一個集合類轉換為一個數據流。

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
Stream<Integer> stream = list.stream();

使用map方法對流中的元素進行修改:

List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd", "", "jkl");
List<String> filtered = strings.stream().map(String::toUpperCase).collect(Collectors.toList());
filtered.forEach(System.out::println);

在上面的示例中,我們使用.map()方法將字符串列表中的所有字符串轉換為大寫字母,並使用collect()方法將結果保存到另一個列表中。

二、streammap的並發問題

在處理大型數據集時,.map()方法可能會遇到並發問題。請考慮以下示例:

List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd", "", "jkl");
List<String> filtered = strings.parallelStream().filter(string -> !string.isEmpty()).map(String::toUpperCase).collect(Collectors.toList());
filtered.forEach(System.out::println);

在這個示例中,我們使用parallelStream()方法實現並發處理,但是.map()方法中的代碼是不等速的,這會導致輸出結果的順序與輸入順序不一致。接下來我們將進行進一步探討。

三、streammap兩個字段值

有時候我們需要同時修改流中的兩個字段的值,例如:

employeeList.stream().map(e -> {
    e.setSalary(e.getSalary() * 1.10);
    e.setDoj(LocalDate.now());
    return e;
}).collect(Collectors.toList());

在上述代碼中,我們使用.map()方法將Employee對象列表中每個Employee對象的薪資增加了10%並將Date of Joining設置為今天。在這種情況下,.map()方法中使用的Lambda表達式需要一個返回Employee對象的語句。

四、streammap是什麼意思

在Java 8中,.map()方法返回一個新的流對象,其中每個元素都根據指定的函數進行轉換。.map()方法的使用非常靈活,它的參數可以是Lambda表達式或方法引用。

五、streammap中順序錯亂

在處理大型數據集時,.map()方法可能會遇到順序問題。.map()方法中使用的Lambda表達式不等速時,它們的執行順序將不同於輸入順序。下面是一段示例代碼:

List<String> strings = Arrays.asList("one", "two", "three", "four", "five");
strings.parallelStream().map(item -> {
    System.out.println(Thread.currentThread().getName() + " processing " + item);
    return item.toUpperCase();
}).forEach(item -> System.out.println(item));

在這個示例中,使用了parallelStream()方法實現並發處理。在輸出結果中,輸入項的順序被打亂了,因為在每個item的處理中都有一個隨機的延遲時間。這種情況下,.forEach()方法並不會等待.map()處理完成,所以輸出的順序將是隨機的。

六、streammap執行方法

在前面的示例中,我們使用.collect()方法將結果保存到另一個列表中,.collect()方法是一個收集器,可將數據流中的元素轉換為包含指定結果類型的集合。

.toArray()方法是一個重載的.collect()方法,可以將數據轉換為數組。在以下示例中,我們將結果保存到一個數組中:

String[] array = strings.stream().toArray(String[]::new);

這個數組中的順序與原始列表的順序相同。

七、streammap轉成list

.toList()方法是Java 16中新增的方法,可將數據流轉換為列表。在以下示例中,我們將結果保存到一個列表中:

List<String> list = strings.stream().map(String::toUpperCase).toList();

在這兩種情況下,結果的順序保持不變。

八、streammap的用法

在使用.map()方法時,Lambda表達式需要指定每個元素如何轉換為另一個形式。下面是另一個示例,它將整數列錶轉換為字符串列表:

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<String> digits = numbers.stream().map(n -> String.valueOf(n)).collect(Collectors.toList());

在這個示例中,我們對每個整數執行了一個轉換,並將新的字符串值添加到另一個列表中。

九、streammap中取出list的值且過濾空

在以下示例中,我們將Employee對象列表中每個Employee的firstName和lastName組合成一個字符串並將結果添加到另一個列表中:

List<Employee> employeeList = Arrays.asList(
        new Employee("Tom", "Scott", LocalDdate.of(2000, 1, 1), 40000),
        new Employee("Mary", "Johnson", LocalDate.of(2001, 1, 1), 50000));

List<String> allNames = employeeList.stream()
                .map(employee -> employee.getFirstName() + " " + employee.getLastName()) // mapping employee to a concatenated string to test strings
                .filter(name -> !name.isEmpty())
                .collect(Collectors.toList());

在這個示例中,我們使用.map()方法將每個Employee對象的firstName和lastName組合,然後使用.filter()方法過濾空字符串。最後,我們使用.collect()方法將過濾後的結果保存到另一個列表中。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/291815.html

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

相關推薦

  • 如何使用integratecustomerdata.stream().filter(c->{ if (collectionutil.isnotempty(

    本文將詳細介紹如何在Java編程中使用integratecustomerdata.stream().filter(c->{ if (collectionutil.isnote…

    編程 2025-04-28
  • Linux sync詳解

    一、sync概述 sync是Linux中一個非常重要的命令,它可以將文件系統緩存中的內容,強制寫入磁盤中。在執行sync之前,所有的文件系統更新將不會立即寫入磁盤,而是先緩存在內存…

    編程 2025-04-25
  • 神經網絡代碼詳解

    神經網絡作為一種人工智能技術,被廣泛應用於語音識別、圖像識別、自然語言處理等領域。而神經網絡的模型編寫,離不開代碼。本文將從多個方面詳細闡述神經網絡模型編寫的代碼技術。 一、神經網…

    編程 2025-04-25
  • Python安裝OS庫詳解

    一、OS簡介 OS庫是Python標準庫的一部分,它提供了跨平台的操作系統功能,使得Python可以進行文件操作、進程管理、環境變量讀取等系統級操作。 OS庫中包含了大量的文件和目…

    編程 2025-04-25
  • 詳解eclipse設置

    一、安裝與基礎設置 1、下載eclipse並進行安裝。 2、打開eclipse,選擇對應的工作空間路徑。 File -> Switch Workspace -> [選擇…

    編程 2025-04-25
  • Java BigDecimal 精度詳解

    一、基礎概念 Java BigDecimal 是一個用於高精度計算的類。普通的 double 或 float 類型只能精確表示有限的數字,而對於需要高精度計算的場景,BigDeci…

    編程 2025-04-25
  • git config user.name的詳解

    一、為什麼要使用git config user.name? git是一個非常流行的分布式版本控制系統,很多程序員都會用到它。在使用git commit提交代碼時,需要記錄commi…

    編程 2025-04-25
  • nginx與apache應用開發詳解

    一、概述 nginx和apache都是常見的web服務器。nginx是一個高性能的反向代理web服務器,將負載均衡和緩存集成在了一起,可以動靜分離。apache是一個可擴展的web…

    編程 2025-04-25
  • Linux修改文件名命令詳解

    在Linux系統中,修改文件名是一個很常見的操作。Linux提供了多種方式來修改文件名,這篇文章將介紹Linux修改文件名的詳細操作。 一、mv命令 mv命令是Linux下的常用命…

    編程 2025-04-25
  • MPU6050工作原理詳解

    一、什麼是MPU6050 MPU6050是一種六軸慣性傳感器,能夠同時測量加速度和角速度。它由三個傳感器組成:一個三軸加速度計和一個三軸陀螺儀。這個組合提供了非常精細的姿態解算,其…

    編程 2025-04-25

發表回復

登錄後才能評論