Error message here!

Hide Error message here!

忘记密码?

Error message here!

请输入正确邮箱

Hide Error message here!

密码丢失?请输入您的电子邮件地址。您将收到一个重设密码链接。

Error message here!

返回登录

Close

Stream替代for-编码五分钟-划水五小时

涛姐涛哥 2020-06-22 20:53:00 阅读数:133 评论数:0 点赞数:0 收藏数:0

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;
  }

}
View Code

使用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

执行速度对比截图

 

 

天空没有痕迹

风雨已在心中

 

 

 

版权声明
本文为[涛姐涛哥]所创,转载请带上原文链接,感谢
https://www.cnblogs.com/taojietaoge/p/13166306.html

支付宝红包,每日可领(支付宝免费1-2元支付红包)