Java8新特性学习--Stream类

Stream类用在集合的数据处理方面十分方便,较传统的遍历处理法来说,简直不要太爽。其实这种流式操作在著名的Rxjava里面可能已经用过,只是现在提供了一个官方的API。

1、Stream对象的创建

  • Collection接口都有一个stream()函数,生成相应的Stream对象。
  • Stream类里面提供了静态方法of(T t)、of(T ... values)
// Collection接口的stream()方法
List<String> list = new ArrayList<>();
 Stream<String> stream = list.stream();

// Stream类的静态方法
Stream<Integer> integerStream = Stream.of(1, 2, 3, 1, 5);

2、Stream提供的一系列流式操作函数

– filter: 按照给定的过滤规则过滤元素

– map:按照指定的规则处理stream里的元素,  生成一个新的stream,新的stream中元素和原来stream中元素一一对应

– distinct : 去除stream里的重复元素

– flatMap : 和map类似,不同的是其每个元素转换得到的是Stream对象,会把子Stream中的元素压缩到父集合中

List<String> list1 = Arrays.asList("1", "5", "2", "10", "3");
List<String> list2 = Arrays.asList("2", "0");
List<String> list3 = Arrays.asList("4", "9", "8");
List<String> list4 = Arrays.asList("6");
Stream<List<String>> listStream = Stream.of(list1, list2, list3, list4);
listStream.flatMap(list -> list.stream()).forEach(System.out::println);

//output 
1
5
2
10
3
2
0
4
9
8
6

 

– peek : 给定一个函数, 当stream里的元素被消费的时候就会执行这个函数

List<String> list1 = Arrays.asList("1", "5", "2", "10", "3");        
list1.stream()
      .peek(x -> System.out.println(x + ",被消费了"))
      .forEach(System.out::println);

// output
1,被消费了
1
5,被消费了
5
2,被消费了
2
10,被消费了
10
3,被消费了
3

– reduce  可以用来数组求和等操作

一个参数: Optional<T> reduce(BinaryOperator<T> accumulator);
Stream<Integer> integerStream = Stream.of(1, 2, 3, 1, 5);
Optional<Integer> optional = integerStream.reduce((sum, item) -> {
      System.out.printf("sum =%d , item = %d \n", sum, item);
      return sum + item;
 });
 System.out.println(optional.get());

//output 
sum =1 , item = 2 
sum =3 , item = 3 
sum =6 , item = 1 
sum =7 , item = 5 
12

注意:第一次执行的时候第一个参数的值是Stream的第一个元素,第二个参数是Stream的第二个元素

两个参数:T reduce(T identity, BinaryOperator<T> accumulator);

这里的T是提供一个初始值,如果数组求和的话 第一个值设为0即可,比如我把初值设置为100

Integer reduce = integerStream.reduce(100, (sum, item) -> {
       System.out.printf("sum =%d , item = %d \n", sum, item);
       return sum + item;
});

System.out.println(reduce);

//output 
sum =100 , item = 1 
sum =101 , item = 2 
sum =103 , item = 3 
sum =106 , item = 1 
sum =107 , item = 5 
112

 

– limit 截取前 n个元素

– skip 丢弃前n个元素

– allMatch:是不是Stream中的所有元素都满足给定的匹配条件
– anyMatch:Stream中是否存在任何一个元素满足匹配条件
– findFirst: 返回Stream中的第一个元素,如果Stream为空,返回空Optional
– noneMatch:是不是Stream中的所有元素都不满足给定的匹配条件
– max和min:使用给定的比较器(Operator),返回Stream中的最大|最小值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值