隨着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