当前位置:   article > 正文

Java8使用Lambda表达式案例_arraytodelimitedstring

arraytodelimitedstring

一、Lambda 表达式简介

1、什么是 Lambda 表达式
       Lambda 表达式是在 JDK 8 中引入的一个新特性,可用于取代大部分的匿名内部类。使用 Lambda 表达式可以完成用少量的代码实现复杂的功能,极大的简化代码代码量和代码结构。同时,JDK 中也增加了大量的内置函数式接口供我们使用,使得在使用 Lambda 表达式时更加简单、高效。


为什么需要 Lambda 表达式
       谈起为什么需要 Lambda 表达式,那得从函数式编程开始说起。函数式编程可以简单说是一种编程规范,也就是如何编写程序的方法论。它属于结构化编程的一种,主要思想是把运算过程尽量写成一系列嵌套的函数调用。函数式编程有很多优点,其中包括:

易于并发编程;
代码的热升级;
更方便的代码管理;
代码简洁,开发快速;
接近自然语言,易于理解;
函数式编程在 C#、Python、JavaScript中都得到充分体现,在 Java 8 版本中也得到了支持。最明显的就是对 Lambda 表达式的支持。很多种迹象表明未来编程语言将是逐渐融合各自的特性,而不是单纯的声明式语言函数编程语言。将来声明式编程语言借鉴函数编程思想,函数编程语言融合声明式编程特性,这几乎是一种必然趋势。

       在 Java 中主要引入 Lambda 表达式的作用是对现有编码语义的优化,减少语法冗余。轻量级的将代码封装为数据,使代码简洁,易于理解。
 

二、Lambda表达式使用案例

  1. import com.alibaba.fastjson.JSONArray;
  2. import com.alibaba.fastjson.JSONObject;
  3. import lombok.Data;
  4. import org.apache.commons.lang3.ArrayUtils;
  5. import org.junit.Test;
  6. import org.springframework.util.StringUtils;
  7. import java.util.*;
  8. import java.util.function.Function;
  9. import java.util.stream.Collectors;
  10. import java.util.stream.Stream;
  11. /**
  12. * java8使用lamda表达式
  13. */
  14. public class JavaLambdaTest {
  15. /**
  16. * 字符串转数组,以分隔符
  17. */
  18. @Test
  19. public void stringToArray() {
  20. //java8以前字符串转数组
  21. String str = "0,1,2,3,4,5";
  22. String[] arr = str.split(","); // 用,分割
  23. System.out.println("java8以前字符串转数组 " + Arrays.toString(arr));
  24. }
  25. /**
  26. * 数组转字符串,以分隔符
  27. */
  28. @Test
  29. public void arrayToString() {
  30. String[] arr = {"0", "1", "2", "3", "4", "5"};
  31. //方法一: 遍历
  32. StringBuffer strBuffer = new StringBuffer();
  33. for (String s : arr) {
  34. strBuffer.append(s);
  35. }
  36. System.out.println("java8以前数组转字符串: " + strBuffer.toString());
  37. //方法二: 使用StringUtils的join方法
  38. String str2 = org.apache.commons.lang3.StringUtils.join(arr, ",");
  39. System.out.println("使用StringUtils的join方法: " + str2);
  40. //方法三: 使用org.apache.commons.lang3.ArrayUtils的toString方法
  41. String str3 = ArrayUtils.toString(arr, ",");
  42. System.out.println("使用ArrayUtils的toString方法: " + str2);
  43. List<String> list = new ArrayList<>();
  44. for (int i = 0; i < 10; i++) {
  45. list.add(i + "");
  46. }
  47. //方法四: 使用org.springframework.util.StringUtils的arrayToDelimitedString方法
  48. String str4 = StringUtils.arrayToDelimitedString(list.toArray(new String[list.size()]), ",");
  49. System.out.println("使用StringUtils的arrayToDelimitedString方法: " + str2);
  50. }
  51. /**
  52. * String转List
  53. */
  54. @Test
  55. public void stringToList() {
  56. String str = "11111,你好,是是是";
  57. //方法一: 先使用split方法转成数组,然后再用Arrays.asList方法把数组转成list
  58. //List<String> list1 = Arrays.asList(str.split(","));
  59. List<String> list1 = new ArrayList<String>(Arrays.asList(str.split(",")));
  60. System.out.println("先使用split方法转成数组,然后再用Arrays.asList方法把数组转成list : " + list1);
  61. List<String> list2 = Stream.of(str.split(",")).collect(Collectors.toList());
  62. System.out.println("String字符串转成List<Long>数据格式 : " + list2);
  63. //String字符串转成List<Long>数据格式
  64. String str1 = "1,2,3,4,5,6";
  65. List<Long> list3 = Arrays.stream(str1.split(",")).map(s -> Long.parseLong(s.trim())).collect(Collectors.toList());
  66. System.out.println("String字符串转成List<Long>数据格式 : " + list3);
  67. }
  68. /**
  69. * List转字符串,以分隔符
  70. */
  71. @Test
  72. public void collectionToString() {
  73. List<String> list = new ArrayList<>();
  74. for (int i = 0; i < 10; i++) {
  75. list.add(i + 100 + "");
  76. }
  77. //使用for循环遍历方式
  78. StringBuilder sb = new StringBuilder();
  79. for (int i = 0; i < list.size(); i++) {
  80. if (i != 0) {
  81. sb.append(",");
  82. }
  83. sb.append(list.get(i));
  84. }
  85. System.out.println("使用for循环遍历方式: " + sb.toString());
  86. String newStr = String.join(",", list);
  87. System.out.println("String.join: " + newStr);
  88. //list转字符串,以 , 分割
  89. String str1 = StringUtils.collectionToDelimitedString(list, ",");
  90. System.out.println("StringUtils.collectionToDelimitedString : " + str1);
  91. //方法三:StringUtils.join方法,以,分割
  92. String str2 = org.apache.commons.lang3.StringUtils.join(list, ",");
  93. System.out.println("StringUtils.join方法 : " + str2);
  94. //方法三:使用流的方式
  95. String str3 = list.stream().collect(Collectors.joining(","));
  96. System.out.println("使用流的方式 : " + str3);
  97. //使用流的方式,在连接之前操作字符串
  98. String str = list.stream().map(String::valueOf).collect(Collectors.joining(","));
  99. System.out.println("collectionToString : " + str);
  100. //高级用法 :从list获取某个字段
  101. //String nameStr = list.stream().map(s::getName).collect(Collectors.joining(","));
  102. }
  103. /**
  104. * 数组转成list
  105. */
  106. @Test
  107. public void arrayToList() {
  108. String[] array = {"Java", "Scala", "C++", "Haskell", "Lisp"};
  109. //方法一:Arrays.asList方法
  110. List<String> arrayTolist = new ArrayList<String>(Arrays.asList(array));
  111. System.out.println("Arrays.asList方法 : " + arrayTolist);
  112. //方法二:Collections.addAll方法
  113. ArrayList<String> arrayList = new ArrayList<String>(array.length);
  114. Collections.addAll(arrayList, array);
  115. System.out.println("Collections.addAll方法 : " + arrayList);
  116. //方法三:String数组Stream.of方法
  117. List<String> arrayTolist2 = Stream.of(array).collect(Collectors.toList());
  118. System.out.println("Stream.of方法 : " + arrayTolist2);
  119. //基本类型用法
  120. long[] array2 = {23, 33, 21};
  121. List<Long> longList = Arrays.stream(array2).boxed().collect(Collectors.toList());
  122. System.out.println("基本类型用法: " + longList);
  123. }
  124. /**
  125. * Java8 List转为数组
  126. */
  127. @Test
  128. public void listToArray() {
  129. List<String> list = new ArrayList<>();
  130. for (int i = 0; i < 10; i++) {
  131. list.add(i + 100 + "");
  132. }
  133. //方法一:list.toArray方法
  134. String[] array = list.toArray(new String[list.size()]);
  135. System.out.println("list.toArray方法: " + Arrays.toString(array));
  136. //方法二:list.stream方法
  137. String[] array2 = list.stream().toArray(String[]::new);
  138. System.out.println("list.stream方法: " + Arrays.toString(array2));
  139. //Arrays.stream(array).forEach(str -> System.err.println("listToArray " + str));
  140. }
  141. /**
  142. * collect 提取某个元素组成新List
  143. */
  144. @Test
  145. public void streamToList() {
  146. // List<Long> userIds = userList.stream().map(u -> u.getId()).collect(Collectors.toList());
  147. }
  148. /**
  149. * java8遍历List
  150. */
  151. @Test
  152. public void forEachList() {
  153. List<String> list = new ArrayList<>();
  154. for (int i = 0; i < 10; i++) {
  155. list.add(i + 100 + "");
  156. }
  157. //Java8 lambda遍历list(简化写法)
  158. list.forEach(s -> System.out.println(s));
  159. //Java8 lambda遍历list使用 equals
  160. list.forEach(item -> {
  161. if ("C".equals(item)) {
  162. System.out.println(item);
  163. }
  164. });
  165. //contains 过滤
  166. list.stream().filter(s -> s.contains("100")).forEach(s -> System.out.print(s));
  167. }
  168. /**
  169. * Java8 List转换Map
  170. */
  171. @Test
  172. public void listToMap() {
  173. List<User> list2 = new ArrayList<>();
  174. for (int i = 0; i < 10; i++) {
  175. User user = new User();
  176. user.setName("张三" + i);
  177. user.setAge(i);
  178. list2.add(user);
  179. }
  180. //List转换Map
  181. Map<Object, Object> map = list2.stream().collect(Collectors.toMap((key -> key), (value -> value)));
  182. map.forEach((key, value) -> System.out.println("key:" + key + " value:" + value));
  183. System.out.println("—————— List转换Map组合使用 ——————");
  184. //提取list里面age属性,组成一个新map
  185. Map<Integer, User> map1 = list2.stream().collect(Collectors.toMap(User::getAge, user -> user));
  186. Map<Integer, User> map2 = list2.stream().collect(Collectors.toMap(user -> user.getAge(), Function.identity()));
  187. System.out.println("提取list里面age属性,组成一个新map: " + map1);
  188. System.out.println("提取list里面age属性,组成一个新map: " + map2);
  189. //将集合中(name, age提取)转换成map
  190. Map map3 = list2.stream().collect(Collectors.toMap(User::getName, User::getAge));
  191. System.out.println("将集合中(name, age提取)转换成map: " + map3);
  192. // List转为Map按Name分组
  193. Map<String, List<User>> map4 = list2.stream().collect(Collectors.groupingBy(User::getName));
  194. System.out.println("List转为Map按Name重复分组: " + map4);
  195. // List转为Map年龄排序后,再根据ID分组
  196. Collections.sort(list2, Comparator.comparing(User::getName).thenComparing(User::getAge));
  197. }
  198. /**
  199. * java8遍历Map
  200. */
  201. @Test
  202. public void forEachMap() {
  203. Map<String, Object> map = new HashMap<>(16);
  204. map.put("A", 10);
  205. map.put("B", 20);
  206. map.put("C", 30);
  207. //Java8之前遍历是这样遍历map
  208. for (Map.Entry<String, Object> entry : map.entrySet()) {
  209. System.out.println("Java8之前遍历 " + "key:" + entry.getKey() + " value:" + entry.getValue());
  210. }
  211. //Java8遍历map
  212. map.forEach((key, value) -> System.out.println("Java8遍历map " + "key:" + key + " value:" + value));
  213. //Java8遍历map使用equals
  214. map.forEach((k, v) -> {
  215. System.out.println("Item : " + k + " Count : " + v);
  216. if ("C".equals(k)) {
  217. System.out.println("Java8遍历map使用equals " + "C : " + k);
  218. }
  219. });
  220. }
  221. /**
  222. * Java8 Map使用Filter->String
  223. */
  224. @Test
  225. public void Filter() {
  226. Map<String, String> map = new HashMap<>(16);
  227. map.put("A", "11");
  228. map.put("B", "11");
  229. //获取map里面 value="11"的字段
  230. String str = map.entrySet().stream().filter(m -> "11".equals(m.getValue()))
  231. .map(m -> m.getValue()).collect(Collectors.joining());
  232. System.out.println("str : " + str);
  233. //获取map里面某个字符串
  234. String str2 = map.entrySet().stream().filter(m -> m.getKey().equals("B"))
  235. .map(m -> m.getValue()).collect(Collectors.joining());
  236. System.out.println("获取map里面某个字符串 : " + str2);
  237. // Filter过滤某个值,形成新的map
  238. Map<String, String> newMap = map.entrySet().stream().filter(m -> m.getKey().equals("A"))
  239. .collect(Collectors.toMap(p -> p.getKey(), p -> p.getValue()));
  240. System.out.println("Filter过滤某个值,形成新的map : " + newMap);
  241. }
  242. /**
  243. * List转换Set
  244. */
  245. @Test
  246. public void listToSet() {
  247. List<User> list = new ArrayList<>();
  248. for (int i = 0; i < 10; i++) {
  249. User user = new User();
  250. user.setName("张三" + i);
  251. list.add(user);
  252. }
  253. //方法一: 使用distinct方法把List转换Set
  254. Set<String> set = list.stream().map(s -> s.getName()).distinct().collect(Collectors.toSet());
  255. System.out.println("listToSet : " + set);
  256. }
  257. /**
  258. * Java8 distinct 获取某个属性并去重
  259. */
  260. @Test
  261. public void distinct() {
  262. List<String> list = new ArrayList<>();
  263. list.add("张三");
  264. list.add("张三");
  265. System.out.println("去重前数据: " + list.toString());
  266. //方法一: 去除list里面所有重复的数据
  267. List<String> distinct1 = list.stream().distinct().collect(Collectors.toList());
  268. System.out.println("去除list里面所有重复的数据 : " + distinct1);
  269. //方法二: 去除list里面重复的数据
  270. List<String> distinct2 = list.stream().map(String::valueOf).collect(Collectors.toList()).stream().distinct().collect(Collectors.toList());
  271. System.out.println("distinct2 : " + distinct2);
  272. //方法三: 根据某个字段去重
  273. //List<String> distinct2 = list.stream().map(String::getName).collect(Collectors.toList()).stream().distinct().collect(Collectors.toList());
  274. long count = list.stream().distinct().count();
  275. System.out.println("去重后统计数量 :" + count);
  276. //去重后以,分割成字符串
  277. String str = list.stream().distinct().collect(Collectors.joining(","));
  278. System.out.println("去重后以,分割成字符串: " + str);
  279. }
  280. /**
  281. * 使用lamda sort排序
  282. */
  283. @Test
  284. public void sort() {
  285. List<String> list = new ArrayList<>();
  286. for (int i = 0; i < 10; i++) {
  287. list.add(String.valueOf(i));
  288. }
  289. // 1、传递代码,函数式编程
  290. // list.sort(new AppleComparator());
  291. // System.out.println("函数式编程 : " + list.toString());
  292. // 2、匿名内部类排序
  293. list.sort(new Comparator<String>() {
  294. @Override
  295. public int compare(String o1, String o2) {
  296. return Integer.parseInt(o1) - Integer.parseInt(o2);
  297. }
  298. });
  299. System.out.println("匿名内部类排序 升序 : " + list.toString());
  300. //匿名内部类排序简化写法
  301. Collections.sort(list, (o1, o2) -> o1.compareTo(o2));
  302. System.out.println("匿名内部类排序 升序 : " + list.toString());
  303. //3、使用Lambda表达式
  304. //list.sort((a, b) -> a.getWeight() - b.getWeight());
  305. //对象排序
  306. list.sort((a, b) -> a.compareTo(b));
  307. System.out.println("Lambda表达式 升序 : " + list.toString());
  308. list.sort((b, a) -> a.compareTo(b));
  309. System.out.println("Lambda表达式 降序 : " + list.toString());
  310. //等价于3
  311. list.sort((a, b) -> Integer.parseInt(a) - Integer.parseInt(b));
  312. System.out.println("用法3 ——》升序 : " + list.toString());
  313. list.sort((a, b) -> Integer.parseInt(b) - Integer.parseInt(a));
  314. System.out.println("用法3 ——》降序 : " + list.toString());
  315. //4、使用Comparator的comparing
  316. list.sort(Comparator.comparing(a -> a));
  317. System.out.println("comparing 升序 : " + list.toString());
  318. Collections.sort(list, Comparator.comparing(String::valueOf).reversed());
  319. System.out.println("comparing 降序 : " + list.toString());
  320. //5对象集合操作
  321. List<User> list1 = new ArrayList<User>();
  322. User user = new User("张三", 15, "男");
  323. User user1 = new User("李四", 10, "男");
  324. list1.add(user);
  325. list1.add(user1);
  326. //在Comparator.comparing中定义排序反转
  327. list1.sort(Comparator.comparing(User::getName, Comparator.reverseOrder()));
  328. System.out.println("在Comparator.comparing中定义排序反转 : " + list.toString());
  329. //在Stream中定义排序反转
  330. list1.stream().sorted(Comparator.comparing(User::getName, Comparator.reverseOrder())).collect(Collectors.toList());
  331. System.out.println("在Stream中定义排序反转 : " + list.toString());
  332. //1、年龄升序
  333. list1.sort((a, b) -> String.valueOf(a.getAge()).compareTo(String.valueOf(b.getAge())));
  334. //2、姓名降序排列
  335. list1.sort(Comparator.comparing(User::getName).reversed());
  336. //等价于 2
  337. list1.sort(Comparator.comparing(a -> ((User) a).getAge()).reversed());
  338. //3、先按性别排,如果年龄相同,再按年龄排序
  339. list1.sort(Comparator.comparing(User::getSex).reversed().thenComparing(User::getAge));
  340. //6.对JSONArray 排序
  341. JSONArray resultArray = new JSONArray();
  342. JSONObject result = new JSONObject();
  343. result.put("name", "张三");
  344. result.put("age", "15");
  345. result.put("data", "201812130451");
  346. resultArray.add(result);
  347. //根据姓名的倒序排序
  348. resultArray.sort(Comparator.comparing(obj -> ((JSONObject) obj).getString("name")).reversed());
  349. System.out.println("根据姓名的倒序排序 :----->" + resultArray.toString());
  350. //根据时间倒序排序
  351. resultArray.sort(Comparator.comparing(obj -> ((JSONObject) obj).getDate("data")).reversed());
  352. System.out.println("根据时间倒序排序 :----->" + resultArray.toString());
  353. //根据年龄升序排序
  354. resultArray.sort(Comparator.comparing(obj -> ((JSONObject) obj).getInteger("age")));
  355. System.out.println("根据年龄升序排序 :----->" + resultArray.toString());
  356. }
  357. /**
  358. * Java8 groupingBy 分租
  359. */
  360. @Test
  361. public void groupingBy() {
  362. List<User> list = new ArrayList<User>();
  363. User user = new User("张三", 15, "男", "shanghai");
  364. User user1 = new User("李四", 14, "男", "wuhan");
  365. list.add(user);
  366. list.add(user1);
  367. Map<String, List<User>> listGroupingBy1 = list.stream().collect(Collectors.groupingBy(c -> c.getAddress()));
  368. System.out.println("listGroupingBy1: " + listGroupingBy1);
  369. Map<String, List<User>> listGroupingBy2 = list.stream().collect(Collectors.groupingBy(User::getName));
  370. System.out.println("listGroupingBy2: " + listGroupingBy2);
  371. }
  372. /**
  373. * java8使用 equals
  374. */
  375. @Test
  376. public void equals() {
  377. List<String> list = new ArrayList<>();
  378. for (int i = 0; i < 10; i++) {
  379. list.add(i + "");
  380. }
  381. System.out.println("list的值: " + list);
  382. //Java8 lambda遍历list使用 equals
  383. list.forEach(item -> {
  384. if ("1".equals(item)) {
  385. System.out.println("item的值: " + item);
  386. }
  387. });
  388. }
  389. /**
  390. * Java8 基本操作 equals contains filter groupingBy sum max min count average anyMatch allMatch limit
  391. */
  392. @Test
  393. public void basicOperation() {
  394. List<User> list = new ArrayList<User>();
  395. User user = new User("张三", 15, "男", "shanghai");
  396. User user1 = new User("李四", 15, "男", "wuhan");
  397. list.add(user);
  398. list.add(user1);
  399. //求和
  400. int sum = list.stream().collect(Collectors.summingInt(User::getAge));
  401. System.out.println("sum : " + sum);
  402. //Java8使用equals 匿名内部类写法
  403. list.forEach(item -> {
  404. if ("1".equals(item)) {
  405. System.out.println("item的值: " + item);
  406. }
  407. });
  408. //contains
  409. list.stream().filter(s -> s.getName().contains("张三")).forEach(s -> System.out.print(s));
  410. //找出年龄最大
  411. Optional<User> max = list.stream().max((e1, e2) -> Integer.compare(e1.getAge(), e2.getAge()));
  412. System.out.println("max : " + max);
  413. //找出年龄最小
  414. Optional<User> min = list.stream().min((e1, e2) -> Integer.compare(e1.getAge(), e2.getAge()));
  415. System.out.println(min);
  416. //统计个数
  417. long count = list.stream().filter(s -> s.getName().equals("Shanghai")).count();
  418. System.out.println("count : " + count);
  419. //groupingBy
  420. Map<String, List<User>> groupingBy = list.stream().collect(Collectors.groupingBy(c -> c.getAddress()));
  421. System.out.println("groupingBy : " + groupingBy);
  422. //anyMatch
  423. boolean anyMatch = list.stream().anyMatch(s -> s.getName().equals("李四"));
  424. System.out.println("anyMatch : " + anyMatch);
  425. //返回所有Age大于14
  426. boolean matched = list.stream().allMatch(s -> s.getAge() > 14);
  427. System.out.println("matched : " + matched);
  428. //查找姓名是张三的员工
  429. Optional<User> findAny = list.stream().filter(s -> s.getName().equals("张三")).findAny();
  430. System.out.println("findAny : " + findAny);
  431. //获取年龄最高的前2条员工信息
  432. List<User> limit = list.stream().sorted((e1, e2) -> Integer.compare(e2.getAge(), e1.getAge()))
  433. .limit(2).collect(Collectors.toList());
  434. System.out.println("limit : " + limit);
  435. //获取平均年龄
  436. OptionalDouble average = list.stream().mapToInt(s -> s.getAge()).average();
  437. System.out.println("average:" + average);
  438. //工作地点的平均工资
  439. System.out.println(">>>>获取工作地点的平均年龄");
  440. OptionalDouble optionalDouble = list.stream().filter(s -> s.getAddress().equals("Shanghai")).mapToInt(s -> s.getAge()).average();
  441. System.out.println("optionalDouble:" + optionalDouble);
  442. }
  443. }
  444. @Data
  445. class User {
  446. private String name;
  447. private int age;
  448. private String sex;
  449. private String address;
  450. public User() {
  451. }
  452. public User(String name, int age, String sex) {
  453. this.name = name;
  454. this.age = age;
  455. this.sex = sex;
  456. }
  457. public User(String name, int age, String sex, String address) {
  458. this.name = name;
  459. this.age = age;
  460. this.sex = sex;
  461. this.address = address;
  462. }
  463. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/726805
推荐阅读
  

闽ICP备14008679号