资讯专栏INFORMATION COLUMN

Java 8之数值流使用和构建流的方式

Tychio / 1100人阅读

摘要:数值流的使用想要使用数值流其实很简单,只需要调用方法就可以获得一个数值流了,我们会发现数值流有更多的封装好的计算方法,更加方便我们对数值的计算。运行结果有时候我们可能会想将数值流转换回原来的流,我们可以调用方法。

数值流:

数值流,顾名思义就是专门用来操作基础数据类型的流,那它的作用是什么呢?先看下面的代码。这段代码是获取集合每个对象的num字段的值,然后求所和。得出的结果是15,看上去没有问题,但是要注意的是流在进行求和操作的时候从对象中取出来的是基本类型,会进行装箱操作变成Integer类型再进行求和,性能会有所下降,而数值流就是专门对基本类型数据进行操作的。

public class DataStream {
    public static void main(String[] args){
        List list = new ArrayList();
        Num num1 = new Num(1);
        Num num2 = new Num(2);
        Num num3 = new Num(3);
        Num num4 = new Num(4);
        Num num5 = new Num(5);
        list.add(num1);
        list.add(num2);
        list.add(num3);
        list.add(num4);
        list.add(num5);
        System.out.println(list.stream().map(Num::getNum).reduce(Integer::sum));
    }
}

class Num{
    private int num;

    public Num(int num) {
        this.num = num;
    }

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }
}
数值流的使用:

1.想要使用数值流其实很简单,只需要调用Stream.mapToInt()方法就可以获得一个数值流了,我们会发现数值流有更多的封装好的计算方法,更加方便我们对数值的计算。

System.out.println(list.stream().mapToInt(Num::getNum).count());
System.out.println(list.stream().mapToInt(Num::getNum).sum());
System.out.println(list.stream().mapToInt(Num::getNum).max());
System.out.println(list.stream().mapToInt(Num::getNum).min());
System.out.println(list.stream().mapToInt(Num::getNum).average());

运行结果:

5
15
OptionalInt[5]
OptionalInt[1]
OptionalDouble[3.0]

2.需要注意的是maxminaverage方法如果在流为空的时候获取不到值会返回空的Optional对象,而countsum方法则是返回0。

运行结果:

0
0
OptionalInt.empty
OptionalInt.empty
OptionalDouble.empty

3.有时候我们可能会想将数值流转换回原来的流,我们可以调用boxed()方法。

public static void changeStream(){
    int[] arr = new int[]{1,2,3,4,5};
    IntStream intStream =  Arrays.stream(arr);
    Stream stream = intStream.boxed();
}

4.上面我们介绍的是IntStream,它专门用来处理int类型的数值,除此之外还有DoubleStreamLongStream,它们分别处理doublelong类型的数值,只要调用mapToDoublemapToLong方法即可获得对应的数值流,使用方法也是IntStream大同小异,这里就不做详细介绍了。

构建流:

之前的文章中我们一直都是直接调用集合的stream方法来获取一个流,其实获取流的方式有很多种。

直接使用值初始化流

public static void valueStream(){
    Stream stream = Stream.of("Hello", "World ");
    stream.map(String::toUpperCase).forEach(System.out::println);
}

使用Arrays.stream()静态方法创建流,这个方法接受一个数组

public  static void arrayStream(){
    String[] strs = new String[]{"Hello","World"};
    Arrays.stream(strs).map(String::toUpperCase).forEach(System.out::println);
}

从文件中读取获取流,每一行就是流中的一个元素

public static void fileStream(){
    try {
        Stream text = Files.lines(Paths.get("C:UsersHalfDesktop	est.txt"),Charset.defaultCharset());
        text.forEach(System.out::println);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

用函数生成无限流,分别调用Stream.iterate()Stream.generate()方法即可,两者不同之处在于Stream.iterate()方法没生成一个值都要依赖于前一个值,适合生成连续的数值,而Stream.generate()则每个值都是独立生成的,相互之间没有关联。要注意的是因为是无限流,所以会一直生成元素,所以必须要调用limit()方法来限制生成的个数,否则代码会一直运行下。

Stream.iterate()接受两个参数,分别是起始值和后续值的生成代码,例如下面这个方法就是从0开始,依次加10

public static void iterateStream(){
    Stream.iterate(0, num -> num+10).limit(5).forEach(System.out::println);
}

运行结果:

0
10
20
30
40

Stream.generate()接受一个参数,生成数值的代码

public static void generateStream(){
    Stream.generate(Math::random).limit(5).forEach(System.out::println);
}

运行结果:

0.9538068193407456
0.5113995186169759
0.20525086606957266
0.2974528805300197
0.019653649898021208

总结:

这篇文章介绍了数值流和构建流的方式,流的应用可以很灵活,后续还会介绍流的用法。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/77120.html

相关文章

  • Java8新特性总览

    摘要:新特性总览标签本文主要介绍的新特性,包括表达式方法引用流默认方法组合式异步编程新的时间,等等各个方面。还有对应的和类型的函数连接字符串广义的归约汇总起始值,映射方法,二元结合二元结合。使用并行流时要注意避免共享可变状态。 Java8新特性总览 标签: java [TOC] 本文主要介绍 Java 8 的新特性,包括 Lambda 表达式、方法引用、流(Stream API)、默认方...

    mayaohua 评论0 收藏0
  • Java8特性③Stream的使用

    摘要:归约把一个流中的元素组合起来,使用操作来表达更复杂的查询,比如计算菜单中的总卡路里或菜单中卡路里最高的菜是哪一个。有没有交易员是在深圳工作的打印生活在北京的交易员的所有交易额。 筛选和切片 filter 方法 distinct 方法 limit 方法 skip 方法 谓词筛选 Stream 接口支持 filter 方法,该操作会接受一个谓词(一个返回 boolean的函数)作为参数...

    Barry_Ng 评论0 收藏0
  • Java8实战》-第四章读书笔记(引入Stream)

    摘要:内部迭代与使用迭代器显式迭代的集合不同,流的迭代操作是在背后进行的。流只能遍历一次请注意,和迭代器类似,流只能遍历一次。 流(Stream) 流是什么 流是Java API的新成员,它允许你以声明性方式处理数据集合(通过查询语句来表达,而不是临时编写一个实现)。就现在来说,你可以把它们看成遍历数据集的高级迭代器。此外,流还可以透明地并行处理,你无需写任何多线程代码了!我会在后面的笔记中...

    _ivan 评论0 收藏0
  • Java 8 的 Stream 来写代码,干净优雅!

    摘要:补充一点使用数值流可以避免计算过程中拆箱装箱,提高性能。其目的主要是打开流,做出某种程度的数据映射过滤,然后返回一个新的流,交给下一个操作使用。终端操作的执行,才会真正开始流的遍历。 Java8的新特性主要是Lambda表达式和流,当流和Lambda表达式结合起来一起使用时,因为流申明式处理数据集合的特点,可以让代码变得简...

    wemall 评论0 收藏0
  • Java8实战》-第五章读书笔记(使用Stream-02)

    摘要:第三个问题查找所有来自于剑桥的交易员,并按姓名排序。第六个问题打印生活在剑桥的交易员的所有交易额。第八个问题找到交易额最小的交易。 付诸实战 在本节中,我们会将迄今学到的关于流的知识付诸实践。我们来看一个不同的领域:执行交易的交易员。你的经理让你为八个查询找到答案。 找出2011年发生的所有交易,并按交易额排序(从低到高)。 交易员都在哪些不同的城市工作过? 查找所有来自于剑桥的交易...

    liangzai_cool 评论0 收藏0

发表评论

0条评论

Tychio

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<