StreamAPI使用

干什么用的

Stream是一组用来处理数组、集合的API。

使用原理

代码简洁函数式编程写出的代码简洁且意图明确,使用stream接口让你从此告别for循环。多核友好,Java函数式编程使得编写并行程序从未如此简单,你需要的全部就是调用一下parallel()方法。

Stream特性

1:不是数据结构,没有内部存储
2:不支持索引访问
3:延迟计算
4:支持并行
5:很容易生成数组或集合(List,Set)
6:支持过滤,查找,转换,汇总,聚合等操

Stream运行机制

Stream分为:源source、中间操作、终止操作。
流的源可以是一个数组、一个集合、一个生成器方法,一个I/O通道等等。
一个流可以有零个和或者多个中间操作,每一个中间操作都会返回一个新的流,供下一个操作使用。一个流只会有一个终止操作Stream只有遇到终止操作,它的源才开始执行遍历操作。

Stream的创建

1、通过数组
a)基础类型数组转换会失败,所以数组类型要使用引用类型。为什么不行,可以参考 Arrays.asList

int[] array={1,23,445,5};
Arrays.asList(array).stream().forEach(a->System.out.println("这里只会输出一次对象地址"+a));
//map中转换也是失败
Arrays.asList(array).stream().map(a->(int[])a).forEach(a->System.out.println("这里只会输出一次对象地址"+a));
Arrays.asList(array).stream().map(a->(int[])a).forEach(a->{int[] b = a;
    for (int i:b) {
        System.out.println("这里只会循环输出"+i);
    }});
//toArray 将基础类型转成应用类型
Integer[] array1 ={1,23,45,6};
Arrays.asList(array1).forEach(a->System.out.println("这里会循环输出"+a));

b) Stream.of()

 // of
Stream<String> stream = Stream.of("aaa", "bbb", "ccc", "bbb");

2、通过集合来: list.stream()
3、通过Stream.generate方法来创建
4、通过Stream.iterate方法来创建
5、其他API创建
a)concat 合并流

//concat 合并流  流被合并之后,就会关闭合并前的流,如果再做合并就会报错
Stream s1 = Stream.of("A", "B", "C", "D");
Stream s2 = Stream.of("E", "F", "G", "H");
Stream s3 = Stream.of("I", "J", "K", "L");
//Stream.concat(s1,s2).forEach(System.out::println);
//Stream.concat(Stream.concat(s1,s2),s3).forEach(System.out::println);

Stream常用API

中间操作

过滤 filter

String str="1,2,3,4,6,5,4,8,9,3,2";
List<String> list1 = Arrays.asList(str.split(","));
//过滤 filter
System.out.println(list1.stream().filter((a)->a.equals("2")).findAny().get());

去重 distinct

list1.stream().distinct().forEach(System.out::println);

排序 sorted

 list1.stream().distinct().sorted().forEach(System.out::println);

截取 limit、skip

 int[] array =list1.stream().mapToInt(Integer::valueOf).distinct().sorted().limit(3).toArray();

转换 map/flatMap

// map 数据转换将String转成int 循环打印
//原始写法
list1.stream().map((a)->Integer.valueOf(a)).filter(a->a%2==0).forEach(a->System.out.println(a));
//简化写法 mapToInt
list1.stream().map(Integer::valueOf).filter(a->a%2==0).forEach(System.out::println);
//为了提升效率,官方也提供了封装好的方法:mapToDouble,mapToInt,mapToLong
list1.stream().mapToInt(Integer::valueOf).filter(a->a%2==0).forEach(System.out::println);

其他 peek

// peek 每个循环都会执行一次
// skip 跳过n个元素
stream.peek(System.out::println).map(String::toUpperCase).peek(System.out::println).skip(1).forEach(System.out::println);

终止操作

循环 forEach
计算 min、max、count、 average

Stream<Integer> stream1 = Stream.of(1,2,6,7,8,3,6,4,21,1);
//min、max、count、 average
//System.out.println(stream1.min((a,b)->a-b).get());
//System.out.println(stream1.max((a,b)->a-b).get());
//System.out.println(stream1.count());
//System.out.println(stream1.mapToInt(Integer::valueOf).average().getAsDouble());

匹配 anyMatch、 allMatch、 noneMatch、 findFirst、 findAny

//anyMatch、 allMatch、 noneMatch、 、
/*if(stream1.anyMatch(a->a>20)){
    System.out.println("匹配其中一个,存在大于20的值");
}*/
/* if(stream1.allMatch(a->a>0)){
    System.out.println("全部匹配大于0");
}*/
/*if(stream1.noneMatch(a->a>22)){
    System.out.println("全部不匹配大于22");
}*/
//findFirst 返回第一数据
//System.out.println(stream1.filter(a->a>7).findFirst().get());
//findAny 随机查找一个
System.out.println(stream1.filter(a->a>7).findAny().get());

汇聚 reduce

//reduce 汇聚操作,可以拼接、求和、最大、最小等计算
String reduce = Stream.of("A", "B", "C", "D").reduce("+", String::concat);
System.out.println("拼接"+reduce);
//求和
System.out.println( Stream.of(1,2,3,4,7,5,2,3,5).reduce(0, (a,b)->a+b));
System.out.println( Stream.of(1,2,3,4,7,5,2,3,5).reduce(Integer::sum).get());

收集器 toArray collect

//toArray 将基础类型转成应用类型
Integer[] array1 =list1.stream().map(Integer::valueOf).distinct().sorted().limit(3).toArray(Integer[]::new);
Arrays.asList(array1).forEach(a->System.out.println("这里只会循环输出"+a));
//collect IntStream将数组转换成List
//构造对象、将数组数据添加到List中、将list数据转给返回list
List list3 =list1.stream().mapToInt(Integer::valueOf).distinct().sorted().limit(3).collect(ArrayList::new,(l1,a)->l1.add(a),(l1,l2)->l1.subList(0,l1.size()));
list3.forEach(System.out::println);
System.out.println("---------");

//collect Stream
List<Integer> ints = Arrays.asList(1, 1, 2, 2, 3);
//返回List
ints.stream().collect(Collectors.toList());
//返回Set
ints.stream().collect(Collectors.toSet());
//返回Map
ints.stream().collect(Collectors.toMap(k -> k, v -> v, (v1, v2) -> v1));
//group分组
ints.stream().collect(Collectors.groupingBy(k -> k));
//partitioningBy分区
ints.stream().collect(Collectors.partitioningBy(k -> k % 2 == 0));

总结

如果lambda表达式看不懂可以参考lambda表达式
代码地址:
https://gitee.com/zhang798/javaDemo.git
分支 java_lambda

git clone https://gitee.com/zhang798/javaDemo.git -b java_lambda
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值