Java8中的Stream详解
java8已经发布相当长一段时间了,我工作中一直维护的几个项目发布在很多环境中,我也不敢保证每个环境的JDK都是1.8版本以上的,也就一直没在工作中使用java8的一些新特性
java8刚发布时我学习了一下,写了一些demo,没有及时的进行归档,现在这些demo基本都已经找不到了。在工作中每每遇到对集合进行一些操作时都很头疼,只能不停的对集合进行for循环,有时还需要对同一个集合循环两次以上,不仅效率不高,还浪费服务器资源,数据量大时还可能内存溢出
痛定思痛,我还是决定把学而又忘的java8的新特性进行重新的梳理和学习,本文主要讲如何利用stream对集合进行一系列的操作,包括排序、取最大值、过滤等
没有过多的文字描述,直接上代码。以下代码中的每个方法都可以单独拿出来运行,方便在实际工作中的快速使用
package com.helianxiaowu.java8;
import org.junit.Test;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/**
* @title java8的集合stream操作详解
* @desc
* @author helianxiaowu
* @date 2020/2/1 23:20
*/
public class StreamDemo {
/**
* 获取集合中的最大值或最小值
*/
@Test
public void testMaxAndMin(){
List<Integer> list = Arrays.asList(1, -1, 2, -2);
Integer max = list.stream().max((i, j) -> Integer.compare(i, j)).get();
Integer min = list.stream().min((i, j) -> Integer.compare(i, j)).get();
System.out.printf("max=%s, min=%s", max, min); // max=2, min=-2
}
/**
* 排序
*/
@Test
public void testSorted() {
List<Integer> list = Arrays.asList(1, 4, 3, 2);
// 正序排序
List<Integer> sortedList1 = list.stream().sorted().collect(Collectors.toList());
System.out.printf("sortedList1=%s%n", sortedList1);// sortedList1=[1, 2, 3, 4]
// 倒序排序
List<Integer> sortedList2 = list.stream().sorted((i, j)-> Long.compare(j, i)).collect(Collectors.toList());
System.out.printf("sortedList2=%s", sortedList2);// sortedList2=[4, 3, 2, 1]
}
/**
* 使用map可以访问list中的元素的某些属性或方法
*/
@Test
public void testMap() {
List<String> list = Arrays.asList("a", "java", "helianxiaowu");
// 获取list中的字符串的长度
List<Integer> mapList = list.stream().map(String::length).collect(Collectors.toList());
System.out.printf("mapList=%s%n", mapList); // mapList=[1, 4, 12]
}
/**
* 滤重
*/
@Test
public void testDistinct() {
List<Integer> list = Arrays.asList(1, 2, 2, 3, 3, 3);
List<Integer> distinctList = list.stream().distinct().collect(Collectors.toList());
System.out.printf("distinctList=%s", distinctList); // distinctList=[1, 2, 3]
}
/**
* limit可以取出集合中的前n个元素
*/
@Test
public void testLimit() {
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6);
// 取出前3个元素
List<Integer> limitList = list.stream().limit(3).collect(Collectors.toList());
System.out.printf("limitList=%s", limitList); // limitList=[1, 2, 3]
}
/**
* skip可以去除list中的前n个元素,与limit相反作用
*/
@Test
public void testSkip() {
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6);
// 去除list中的前3个元素
List<Integer> skipList = list.stream().skip(3).collect(Collectors.toList());
System.out.printf("skipList=%s", skipList); // skipList=[4, 5, 6]
}
/**
* 根据条件过滤集合中的元素
*/
@Test
public void testFilter() {
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6);
// 过滤能被2整除的元素
List<Integer> filterList = list.stream().filter(i -> i%2==0).collect(Collectors.toList());
System.out.printf("filterList=%s", filterList); // filterList=[2, 4, 6]
}
/**
* 聚合
*/
@Test
public void testReduce() {
List<Integer> list = Arrays.asList(1, 2, 3, 4);
// 计算list中所有元素的乘积
Integer integer = list.stream().reduce((i, j) -> i * j).get();
System.out.printf("integer=%s", integer); // integer=24
}
/**
* 匹配
* anyMatch 集合中的元素有一个满足条件就返回true
* allMatch 集合中的元素全部满足条件返回true
* noneMatch 集合中的元素都不满足条件返回true
*/
@Test
public void testMatch() {
List<Integer> list = Arrays.asList(1, 2, 3, 4);
// list中有没有大于等于4的元素
boolean b1 = list.stream().anyMatch(i -> i >= 4);
System.out.printf("b1=%s%n", b1);// b1=true
// list中的元素是否全部大于4
boolean b2 = list.stream().allMatch(i -> i > 4);
System.out.printf("b2=%s%n", b2); // b2=false
// list中的元素是否没有大于4的
boolean b3 = list.stream().noneMatch(i -> i > 4);
System.out.printf("b3=%s", b3);// b3=true
}
}
stream使用起来如此方便,或许你会关心它的性能到底如何。可以参考相关的性能测试数据,结论是stream的性能无需担心
— 【 THE END 】— 本公众号全部博文已整理成一个目录,请在公众号里回复「m」获取! 最近面试BAT,整理一份面试资料《Java面试BATJ通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。
获取方式:点“在看”,关注公众号并回复 PDF 领取,更多内容陆续奉上。
文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)
评论