1. 程式人生 > 實用技巧 >Stream替代for-編碼五分鐘-划水五小時

Stream替代for-編碼五分鐘-划水五小時

Stream替代for-編碼五分鐘-划水五小時

    天空沒有痕跡,風雨已在心中。

背景:使用Stream 流式操作取代俄羅斯式套娃的for迴圈解放底層勞動密集型碼畜的雙手,使編碼五分鐘划水五小時,不再是夢!

一、Stream替代for例子

給定一個字串元素列表,裡面有數字型字串、有字母型字串,字串裡有大寫、小寫,字串長度也有長有短;現在要通過程式碼完成一個功能:

找出所有長度 >=5 的字串、並且忽略大小寫、去除重複字串、然後按照字母排序、最後用“”連成一個字串輸出。

使用for迴圈實現:

 package com.tjt.jvm;

 import java.util.Arrays;
import java.util.List;
import java.util.Set;
import java.util.TreeSet; public class This4String { public static void main(String[] args) {
List<String> list = Arrays.asList("5", "2", "courage", "love", "kindness", "0", "care",
"RESPECT", "courage", "99", "HONEST", "8");
// 使用Set 的去重功能定義一個具備字母排序能力的容器
Set<String> sortSet = new TreeSet<>(String::compareTo); // 按照字母排序 // for迴圈完成元素去重、大小寫轉換和長度判斷:for迴圈1
for (int i = 0; i < list.size(); i++) {
String str = list.get(i);
if (!isNum(str) && str.length() >= 5) {
// 轉小寫
String lowerAlpha = str.toLowerCase();
sortSet.add(lowerAlpha);
}
} StringBuffer sb = new StringBuffer();
// for迴圈完成連詞成句:for迴圈1
for (String temp : sortSet) {
sb.append(temp);
sb.append("");
}
String result = sb.substring(0, sb.length() - 1);
System.out.println("result is: " + result); } /**
* 判斷輸入字串是字母還是數字
*
* @param str
* @return if number return false
*/
public static Boolean isNum(String str) {
for (int i = 0; i < str.length(); i++) {
if (!Character.isDigit(str.charAt(i))) {
return false;
}
}
return true;
} }

使用Stream 流實現:

 package com.tjt.jvm;

 import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream; public class This4For { public static void main(String[] args) {
List<String> list = Arrays.asList("5", "2", "courage", "love", "kindness", "0", "care",
"RESPECT", "courage", "99", "HONEST", "8");
Stream<String> stream = list.stream(); // list轉Stream 流
String result = stream.filter(i -> !isNum(i)) // 過濾得到字母型別
.filter(i -> i.length() >= 5) // 過濾長度 >=5 的字串
.map(i -> i.toLowerCase()) // 轉小寫
.distinct() // 去重
.sorted(Comparator.naturalOrder()) // 字串排序
.collect(Collectors.joining("")); // 連線
System.out.println(result); } /**
* 判斷輸入字串是字母還是數字
*
* @param str
* @return
*/
public static Boolean isNum(String str) {
for (int i = 0; i < str.length(); i++) {
if (!Character.isDigit(str.charAt(i))) {
return false;
}
}
return true;
} }

最後在執行速度上也沒什麼擦別,簡單測試了一哈~截圖為證~74ms

執行速度對比截圖

                 天空沒有痕跡

                風雨已在心中