@Test
void test(){
List<String> strings = Arrays.asList("1234567","222333","a","","B");
List<Integer> ints = Arrays.asList(1,2,3,10,0);
/*Java 8之后在Collection接口中新增的方法
* 允许以声明式的代码来处理数据
* 使用stream方法将集合转为一个Stream实例*/
Stream<String> stream = strings.stream();
/*Stream中提供了一些方法来处理其中的数据
* filter方法的参数是一个函数式接口,所以可以使用Lambda表达式
* 将处理数据的逻辑写在其抽象方法中(该方法会返回一个boolean值),对其每个元素进行条件对比,
* 如果返回值为true则保留,否则被过滤
* 例如将其中的空字符串过滤掉,Java 8后的API支持链式编程
* 使用collect方法来将Stream还原为指定类型的集合*/
strings = stream.filter(s -> !s.isEmpty()).collect(Collectors.toList());
System.out.println(strings);
/*对其中元素做更改,使用map方法
* 将其中元素更改为原来的平方*/
Stream<Integer> stream1 = ints.stream();
ints = stream1.map(i -> i*i).collect(Collectors.toList());
System.out.println(ints);
/*Tip:Stream的所有操作不会直接影响原集合中的元素*/
/*collect方法的其他用法,这个方法什么效果,取决于传递的参数*/
/*将当前Stream中的所有元素连接在一起并以指定字符串做为分隔
* 要注意的是此Stream的泛型参数必须实现CharSequence接口,即他必须是一个字符序列
* 若不是,则编译不通过,另外当调用此方法的Stream被操作或关闭则会抛出异常,如下
*/
// stream.collect(Collectors.joining("")); 会报java.lang.IllegalStateException
/*正确操作,获取新的Stream*/
String s = strings.stream().collect(Collectors.joining("|"));
System.out.println(s);
/*高逼格操作:再次过滤,去除其中的纯数字字符串*/
strings = strings.stream().filter(s1 -> Arrays.asList(s1.split(""))
/*count方法:统计当前Stream中的元素数量*/
.stream().filter( c -> c.charAt(0)<48||c.charAt(0)>57).count() !=0)
.collect(Collectors.toList());
/*好吧我承认用正则会更简洁
* 那你为什么不用?
* 不会,太繁琐,不想学,百度有现成的*/
System.out.println(strings);
/*其他的方法
* distinct():去除重复元素,有序的Stream只保留索引最小的元素
* sorted():对当前Stream中的元素进行自然排序
* limit(long maxSize) : 截取到第maxSize个元素,maxSize若超过元素数量则会抛出异常
* parallelStream() :由集合实例调用,创建一个并行流,即对流中操作时,对每个元素都会开启一个独立的线程
* 优点是效率较高,但较为消耗CPU资源,同时可能会出现一些并发问题
* forEach(Lambda) : 用于遍历其中元素,用法等同与集合中的forEach()
* mapToInt(..),mapToLong(..),mapToDouble(..) :会创建对应的数值流,前提是Stream的泛型要与之匹配
* summaryStatistics():会返回一个结果收集器,此方法只能被数值流调用
* 结果收集器中的方法有:
* getMax(),getMin(),getSum(),getAverage():获取 最大值,最小值,和,平均值(实际上数值流中也有对应功能的方法)
* combine(other):将同类型的other合并到自身中
* getCount():获取其中包含数值的个数
*/
/*示例,使用结果收集器来获取其中的最大数值*/
IntSummaryStatistics iss = ints.parallelStream()
.distinct().mapToInt(i -> i)
.summaryStatistics();
int max= iss.getMax();
System.out.println(max);
}
Java 8新特性-Stream运算
最新推荐文章于 2024-05-22 16:22:04 发布
本文详细介绍了如何使用Java 8的Stream API对集合进行过滤(移除空字符串)、映射(计算平方)和高级聚合(连接字符串、计数非数字元素)。展示了Stream操作的链式编程风格和各种实用方法,如`filter`, `map`, `collect`, 和 `summaryStatistics`。
摘要由CSDN通过智能技术生成