试水jdk8 stream

jdk8出来日子不短了,jdk11都出来了,不过用的最多的不过是1.5罢了。

今年终于鼓起勇气认真对待它,在18年记录下学习stream,画上一个圆。

Java8中有两大最为重要的改变。第一个是Lambda 表达式;另外一个则是Stream API(java.util.stream.*)。

说说stream吧。前提得有lambda的基础。

Stream 是Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。使用Stream API 对集合数据进行操作,就类似于使用SQL 执行的数据库查询。也可以使用Stream API 来并行执行操作。简而言之,Stream API 提供了一种高效且易于使用的处理数据的方式。

对stream的操作分为三类。

  1. 创建stream
  2. 中间操作(intermediate operations)
  3. 结束操作(terminal operations):

流程如下图

创建stream

虽然大部分情况下stream是容器调用Collection.stream()方法得到的,但stream和collections有以下不同:

  • 无存储。stream不是一种数据结构,它只是某种数据源的一个视图,数据源可以是一个数组,Java容器或I/O channel等。
  • 为函数式编程而生。对stream的任何修改都不会修改背后的数据源,比如对stream执行过滤操作并不会删除被过滤的元素,而是会产生一个不包含被过滤元素的新stream。
  • 惰式执行。stream上的操作并不会立即执行,只有等到用户真正需要结果的时候才会执行。
  • 可消费性。stream只能被“消费”一次,一旦遍历过就会失效,就像容器的迭代器那样,想要再次遍历必须重新生成。

Stream API是Java 8中加入的一套新的API,主要用于处理集合操作,不过它的处理方式与传统的方式不同, 称为“数据流处理”。流(Stream)类似于关系数据库的查询操作,是一种声明式操作。比如要从数据库中获取所有id大于1(filter)的用户的名称(map), 并按照用户的score进行排序(sorted),如果在sql中就会很容易完成,但是在java程序中,在jdk8以前可能要使用很多的if条件,但是在jdk8的stream 流中,我们可以这样

@Test
    public void test5() {
        List<String> collect = list.stream()
                .filter(p -> p.getId() > 1)
                .sorted(Comparator.comparing(Star::getScore))
                .map(Star::getName)
                .collect((Collectors.toList()));
        System.out.println(collect);
    }

 就是这么的容易。

jdk双冒号

还是比较绕的,看代码就明白了。详细借鉴

package com.test;

import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;

import org.junit.Test;

public class DoubleColonTest {
    
    public static void myPrint(String str) {
        System.out.println("print value : " + str);
    }
    
    /**
     * 不使用双冒号
     */
    @Test
    public void test1() {
        List<String> list = Arrays.asList("刘德华","黎明","张学友","郭富城");
        list.forEach(p -> myPrint(p));
    }
    
    /**
     * 使用双冒号
     */
    @Test
    public void test2() {
        List<String> list = Arrays.asList("刘德华","黎明","张学友","郭富城");
        list.forEach(DoubleColonTest::myPrint);
    }
    
    /**
     * 类似于双冒号
     */
    @Test
    public void test3() {
        List<String> list = Arrays.asList("刘德华","黎明","张学友","郭富城");
        Consumer<String> methodParam = DoubleColonTest::myPrint;
        list.forEach(methodParam);
    }
    
    /**
     * 类似于双冒号
     */
    @Test
    public void test4() {
        List<String> list = Arrays.asList("刘德华","黎明","张学友","郭富城");
        Consumer<String> methodParam = DoubleColonTest::myPrint;
        list.forEach(p -> methodParam.accept(p));
    }
    
}

完整代码实例

package com.test;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import org.junit.Before;
import org.junit.Test;

public class TestStream {

    List<Star> list = null;

    @Before
    public void before() {
        list = new ArrayList<Star>() {
            {
                add(new Star(1, "张学友", 11.3));
                add(new Star(3, "刘德华", 4.3));
                add(new Star(2, "黎明", 13.3));
                add(new Star(5, "郭富城", 22.3));
                add(new Star(4, "范冰冰", 2.3));
            }
        };
    }

    /**
     * 遍历方式
     */
    @Test
    public void test1() {
        System.out.println("第一种---------");
        for (Star Star : list) {
            System.out.println(Star);
        }

        System.out.println("第二种---------");
        list.forEach(p -> System.out.println(p));

        System.out.println("第三种---------");
        list.forEach(System.out::println);

        System.out.println("第四种---------");
        Iterator<Star> iterator = list.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }

        System.out.println("第五种---------");
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }

        System.out.println("第六种---------");
        for (Iterator<Star> it = list.iterator(); it.hasNext();) {
            System.out.println(it.next());
        }

        System.out.println("第七种---------");
        for (int i = 0; i < list.size();) {
            System.out.println(list.get(i));
            i++;
        }

    }

    /**
     * 普通排序
     */
    @Test
    public void test2() {
        Collections.sort(list, new Comparator<Star>() {
            @Override
            public int compare(Star o1, Star o2) {
                return o1.getScore().compareTo(o2.getScore());
            }
        });
        list.forEach(p -> System.out.println(p));
    }

    /**
     * lambda排序
     */
    @Test
    public void test3() {
        Collections.sort(list, (p1, p2) -> p1.getScore().compareTo(p2.getScore()));
        list.forEach(p -> System.out.println(p));
    }

    /**
     * streame排序
     */
    @Test
    public void test4() {
        Stream<Star> stream = list.stream().sorted(Comparator.comparing(Star::getScore));// .forEach(p ->
        stream.forEach(p -> System.out.println(p));
        // list.forEach(p -> System.out.println(p));
    }

    /**
     * 进行过滤操作
     */
    @Test
    public void test5() {
        List<String> collect = list.stream()
                .filter(p -> p.getId() > 1)
                .sorted(Comparator.comparing(p -> p.getScore()))
//                .sorted(Comparator.comparing(Star::getScore))
                .map(Star::getName)
                .collect((Collectors.toList()));
        System.out.println(collect);
    }

}

class Star {
    private Integer id;
    private String name;
    private Double score;

    public Double getScore() {
        return score;
    }

    public void setScore(Double score) {
        this.score = score;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Star() {
        super();
    }

    public Star(Integer id, String name, Double score) {
        super();
        this.id = id;
        this.name = name;
        this.score = score;
    }

    @Override
    public String toString() {
        return "Star [id=" + id + ", name=" + name + ", score=" + score + "]";
    }

}

OK,到位,入个门。。。

借鉴的地址

http://www.nowcode.cn/index.php/2017/02/27/326/

https://www.jianshu.com/p/ceb7bf515c03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • java短信接口调用

    之前一直在一个传统的单位上班好多听容易的技术都没接触过,即使有时候想搞一搞类似于支付宝支付,短信接口调用,微信公众号,小程序之类等功能,一直有心无力 终于跳槽了...

    陈灬大灬海
  • c++计算1到100以内的质数

    由于考试使用的是Dev-C++开发工具,为了下次考试做准备,改用该工具,直接下载安装即可,不会涉及到什么破解等

    陈灬大灬海
  • mybatis递归,一对多代码示例

    由于只有这么两级,可以不用使用递归,直接查询父集,之后foreach查询子集放入对应的list集合。

    陈灬大灬海
  • android实现滚动文本效果

    本文实例为大家分享了android实现滚动文本效果的具体代码,供大家参考,具体内容如下

    砸漏
  • 源码系列:基于FPGA的PS2通信电路设计(附源码)

    今天给大侠带来基于FPGA的PS2通信电路设计,附源码,获取源码,请在“FPGA技术江湖”公众号内回复“PS2源码”,可获取源码文件。话不多说,上货。

    FPGA技术江湖
  • 《Java程序设计基础》 第7章手记

    本章主要内容 - 类的私有成员与公共成员 - 方法的重载 - 构造方法 - 类的静态成员 - 对象的应用 本节课知识性内容很多,这里...

    Steve Wang
  • 深入理解Java继承、封装、多态的实现原理

    本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看

    Java技术江湖
  • 如何对类中的private方法进行测试?

    问题:如何对类中的private方法进行测试? 大多数时候,private都是给public方法调用的,其实只要测试public即可。但是有时由于逻辑复杂等原...

    跑马溜溜的球
  • 红包的收益(人人网2017春招真题)

    如你所知,中国素来有发红包的习俗。 新年要到了,小明想要知道朋友圈里每个人的收益。 每个人有mi数量的钱用来发红包,并且这笔钱会平均地发给ki个人(收益...

    AI那点小事
  • R语言︱list用法、批量读取、写出数据时的用法

    列表是一种特别的对象集合,它的元素也由序号(下标)区分,但是各元素的类型可 以是任意对象,不同元素不必是同一类型。元素本身允许是其它复杂数据类型,比如,列表 的...

    素质

扫码关注云+社区

领取腾讯云代金券