Java 8 数据流Stream的基本使用

来源:互联网 发布:淘宝无线端首页尺寸 编辑:程序博客网 时间:2024/06/05 00:48

数据流(Stream)的使用

1) Stream 的获取

① 通过集合Collection获取

② 通过数组获取

1
String[] array = {"are","you","ok"};
2
Stream<String> stream = Array.stream(array);
3
4
//对于基本类型数组的处理
5
int[] array = {1,2,3,4,5};
6
Stream<Integer> stream = Arrays.stream(array).boxed();    //此时Arrays.stream(array)获取的是一个IntStream对象

③ 通过值获取(尽量使用以上2种方式获取,这种方式存在缺陷)


2) 筛选 filter

filter函数接收一个Lambda表达式作为参数,该表达式返回boolean,在执行过程中,流将元素逐一输送给filter,并筛选出执行结果为true的元素;

1
//筛选出列表中的非空项
2
List<String> list = Arrays.asList("are","you","","ok");
3
List<String> filted = list.stream()
4
                      .filter(x-> !x.empty())
5
                      .collect(Collectors.toList());

3) 去重 distinct

4) 截取 limit

截取流的前N个元素:

1
List<String> list = Arrays.asList("are","you","fucking","ok");
2
List<String> distincted = list.stream()
3
                          .limit(3);
4
                          .collect(Collectors.toList());

5) 跳过 skip

跳过流的前n个元素:

6) 映射 map

对流中的每个元素执行一个函数,使得元素转换成另一种类型输出。流会将每一个元素输送给map函数,并执行map中的Lambda表达式,最后将执行结果存入一个新的流中。 
如:将 list 中每一个 Integer类型元素自增后转化为 String类型

1
2
List<Integer> list = Arrays.asList(1,2,3,4,5);
3
List<String> result = list.stream()
4
                      .map(x->String.valueOf(++x))
5
                      .collect(Collectors.toList());

7) 合并多个流 flatMap

以下一个实际的应用例子:列出 list 中各不相同的单词;
1
List<String> list = new ArrayList<String>();
2
list.add("I am a boy");
3
list.add("I love the girl");
4
list.add("But the girl loves another girl");
5
6
list.stream().map(line->line.split(" "))    //将每一个项分词,并映射为数组
7
             .flatMap(Arrays::stream)       //将每一个分项数组组合并到主流中,形成一个包含所有分项数组的总数组流
8
             .distinct();                   //去重
9
             .forEach(System.out::println);   //打印

8)匹配元素

 ①是否匹配任一元素:anyMatch

anyMatch用于判断流中是否存在至少一个元素满足指定的条件,这个判断条件通过Lambda表达式传递给anyMatch,执行结果为boolean类型。 

② 是否匹配所有元素:allMatch

allMatch用于判断流中的所有元素是否都满足指定条件,这个判断条件通过Lambda表达式传递给anyMatch,执行结果为boolean类型。 
如,判断是否所有人都是学生:

1
//判断流中是否全部>5
2
List<Integer> list = Arrays.asList(1,2,3,4,5,6);
3
boolean result = list.stream()
4
                     .allMatch(x->x>5);
③ 是否未匹配所有元素:noneMatch

noneMatch与allMatch恰恰相反,它用于判断流中的所有元素是否都不满足指定条件:

9)获取元素

获取任一元素 :findAny

findAny从流中随机选出 一个元素出来,它返回一个Optional类型的元素。

1
List<Integer> list = Arrays.asList(1,2,3,4,5,6);
2
Optional<Integer> result = list.stream().findAny();
3
4
if(result.isPresent())
5
  Integer randValue = result.get();
6
//or:
7
  Integer randValue = result.orElse(0);
8
9
//合并的调用方式
10
Integer randValue = list.stream().findAny().orElse(0);
② 获取第一个元素:findFirst
Optional 对象介绍

Optional是Java8新加入的一个容器,这个容器只存1个或0个元素,它用于防止出现NullpointException,它提供如下方法:

  • isPresent() 
    判断容器中是否有值。
  • ifPresent(Consume lambda) 
    容器若不为空则执行括号中的Lambda表达式。
  • T get() 
    获取容器中的元素,若容器为空则抛出NoSuchElement异常。
  • T orElse(T other) 
    获取容器中的元素,若容器为空则返回括号中的默认值。

10) 归约统计(基于数值流)

归约是将集合中的所有元素经过指定运算,折叠成一个元素输出,如:求最值、平均数等,这些操作都是将一个集合的元素折叠成一个元素输出。

在流中,可以将流装载如相应的 SummaryStatistics 来实现该功能

1
List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
2
IntSummaryStatistics stats = numbers.stream().mapToInt((x) -> x).summaryStatistics();
3
        
4
int max = stats.getMax());        //获取最大值
5
int min = stats.getMin());        //获取最小值
6
double sum =  stats.getSum());    //获取总值
7
double avg = stats.getAverage());  //获取平均值

11) 遍历流 forEach

数据流提供了新的forEach方法遍历该流中的每个元素,方法参数为一个Lambda表达式,用于对每一个遍历的元素执行的操作;

12) 排序 sorted

sorted方法用来流排序,默认升序排布,可以使用一个 Comparator 作为参数来实现自定义排序;

1
//输出10个排序好的随机数
2
Random random = new Random();
3
random.ints().limit(10).sorted().forEach(System.out::println);

13)parallelStream 并行处理

parallelStream是流 进行并行处理的替代方案。



数值流的使用

采用Stream 的 redure 方法 进行数值归约操作会涉及到基本数值类型和引用数值类型之间的装箱、拆箱操作,因此效率较低;
当流操作为纯数值操作时,使用数值流能获得较高的效率;

StreamAPI提供了三种数值流:IntStream、DoubleStream、LongStream;

1)将 Stream 转换成数值流

StreamAPI 提供了将普通流转换成数值流的三种方法:mapToInt、mapToDouble、mapToLong(参数:相应的转化Lambda表达式);

将数值流转化为Stream 的方法:boxed

1
List<Double> list = Arrays.asList(2.3,2.4,2.5,2.7,2.8);
2
3
//普通Stream转为数值Stream
4
DoubleStream doubles = list.stream().mapToDouble(x->x);    //转化为DoubleStream
5
IntStream ints = list.stream().mapToInt(x->Integer.parseInt(String.format("%.0f",x))); //转化为IntStream,同时进行取舍操作
6
7
//数值Stream转为普通Stream
8
Stream stream = list.boxed();

2)数值流的数值计算

每种数值流都提供了数值计算函数,如max、min、sum、avg等。 

由于数值流可能为空,并且给空的数值流计算最大值是没有意义的,因此max函数返回OptionalInt,它是Optional的一个子类,能够判断流是否为空,并对流为空的情况作相应的处理。 
此外,mapToInt、mapToDouble、mapToLong进行数值操作后的返回结果分别为:OptionalInt、OptionalDouble、OptionalLong




Stream转换为Collection 

Stream可以通过Collector收集器,将其转化为各种Collection类型;

① Stream -> 数组
1
//普通转换
2
Stream<String> stream = Arrays.stream("are","you","ok");
3
String[] array = stream().toArray();
4
5
//涉及拆箱、装箱操作的转换
6
Stream<Integer> stream = Stream.of(1,2,3,4,5,6);
7
int[] array = stream.mapToInt(x->x).toArray();
② Stream -> List
③ Stream ->Set
1
Set<Integer> set = stream.collect(Collectors.toCollection(Set::new));
④ Stream ->Stack
1
Stack<Integer> stack = stream.collect(Collectors.toCollection(Stack::new));





0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 滚筒洗衣机惠而浦 真野惠里菜 惠文后 罗茜汉丁顿惠特莉 移动惠生活 惠顾什么意思 阳光惠生活app 友信普惠 惠灵顿 惠生活 极云普惠云电脑 陈正林子惠免费全文 微销惠 泽惠天下万人绿合49hznet 平安普惠为什么一直招人 惠州惠东 惠东 惠东论坛 惠东西子 惠东限行 惠东双月湾 惠东西子江畔惠东窗口 惠东高铁站 惠东高铁 惠东论坛惠东窗口 惠东房价 惠东邮编 惠东景点 惠东鞋厂 惠东租房 西子惠东 惠东在哪里 惠东西子湖畔惠东窗口 惠东火车站 惠东吧 惠东招聘网 惠东在哪 惠东窗口 惠东楼盘 惠东新楼盘 惠东红石材