【java】Stream的使用

首先,给大家推荐一个好的地方:http://ifeve.com/stream/ 可以好好学一下

接下来,今天要删除数组中的某些元素,想到了之前用过的这个JDK8的Stream

 

1.Array转化为Stream并进行筛选

【有个坑】:数组转化为Stream有两种方式

  1.Stream.of(数组)

  2.Arrays.stream(数组)

  区别:两种都支持引用数据类型,但是如果是基本数据类型的话,请选择第二种,所以妥善期间使用第二种比较合适。

 

【注意】:

使用stream进行任何操作,并不会因此而改变原数据的任何地方。因此想要获取到处理后的数据,需要你接收下来。

 

【代码展示】:

①filter中一行代码如下:

@org.junit.Test
    public void test() throws IOException{
        String [] str = "2.1.1&2.1.2&2.1.5&2.1.6&3.1.1&3.2.2&3.3.3&4.1.1&4.1.2&4.1.4&5.1.2&7.1.2&7.2.1&7.3.1.1&7.3.3.1&7.3.4.3&7.3.5.2&7.3.6.2&7.3.6.3".split("&");
        Stream<String> stream = Arrays.stream(str);
        Object[] o1 = stream.filter(s -> s.contains("2.1.")).toArray();
        for (int i = 0; i < o1.length; i++) {
            System.out.println(str[i].toString());
        }
    }

 

②filter中写代码块的代码如下:

【注意】:filter中写代码块,需要true或者false都要返回,否则要报错!

@org.junit.Test
    public void test() throws IOException{
        String [] str = "2.1.1&2.1.2&2.1.5&2.1.6&3.1.1&3.2.2&3.3.3&4.1.1&4.1.2&4.1.4&5.1.2&7.1.2&7.2.1&7.3.1.1&7.3.3.1&7.3.4.3&7.3.5.2&7.3.6.2&7.3.6.3".split("&");
        Stream<String> stream = Arrays.stream(str);
        Object[] o1 = stream.filter(s -> {if(s.contains("3.1.")&& ! s.contains("7.")){
                return true;
            }return false;
        }).toArray();
        //输出原数据
        System.out.println("输出原数据");
        for (int i = 0; i < str.length; i++) {
            System.out.println(str[i]);
        }

        System.out.println("输出处理后数据");
        for (int i = 0; i < o1.length; i++) {
            System.out.println(o1[i]);
        }

    }

 

 

2.List集合转化为Stream

【集合.stream()即可】

 

 

3.使用count()计数

计算List中对象的某个属性值为一个特定值的 对象有多少个

Long shanghaiNum = comList.stream().filter(i->"上海所属产品".equals(i.getBelong())).count();

先把list转化为stream(),然后filter中写出需要满足的筛选条件,最后count()计数。

 

 

4.List进行filter筛选后获取到新的List

List<ComPriceSet> xianList = comList.stream().filter(i-> "西安所属产品".equals(i.getBelong())).collect(Collectors.toList());

 

 

5.List按照对象的某个字段进行去重 distinct()

【需要进行去重操作的对象,重新equals()方法】

例如下面:

package net.shopxx.controller.admin;

/**
 * 产品工具类 内部结算销量统计表
 * @author SXD
 *
 */
public class ProCom {

    private Long productId;
    private String productName;

    public Long getProductId() {
        return productId;
    }
    public void setProductId(Long productId) {
        this.productId = productId;
    }
    public String getProductName() {
        return productName;
    }
    public void setProductName(String productName) {
        this.productName = productName;
    }
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result
                + ((productId == null) ? 0 : productId.hashCode());
        result = prime * result
                + ((productName == null) ? 0 : productName.hashCode());
        return result;
    }

    //规定如果productId一致,则代表两个equals() 为true
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        ProCom other = (ProCom) obj;
        if (productId == null) {
            if (other.productId != null)
                return false;
        } else if (!productId.equals(other.productId))
            return false;

        return true;
    }

}

View Code

List<ProCom>  xianProList =  xianProList.stream().distinct().collect(Collectors.toList())

 

6.List中有需要按照某个字段进行分组,可以使用Collectors.groupingBy()分组器实现

例如:

按照ComLabSet实体中productId进行分组,Collectors.groupingBy(ComLabSet::getProductId)中::后面跟的是你要分组的字段的get方法名

package net.shopxx.controller.admin;

/**
 * 导出实验室对账单 工具类
 * @author SXD
 *
 */
public class ComLabSet  implements Comparable<ComLabSet>{

    private Long orderId;        //订单ID
    private Boolean by_credit_card;//是否赠送 1true   0false
    private Long productId;        //产品ID
    private String productName;    //产品名称
    private String product_belong;//产品所属公司
    private String cybbm;            //采样包编码
    private Long sysId;                //实验室ID
    private String sysName;            //实验室名称

    public Long getOrderId() {
        return orderId;
    }
    public void setOrderId(Long orderId) {
        this.orderId = orderId;
    }
    public Boolean getBy_credit_card() {
        return by_credit_card;
    }
    public void setBy_credit_card(Boolean by_credit_card) {
        this.by_credit_card = by_credit_card;
    }
    public Long getProductId() {
        return productId;
    }
    public void setProductId(Long productId) {
        this.productId = productId;
    }
    public String getProductName() {
        return productName;
    }
    public void setProductName(String productName) {
        this.productName = productName;
    }
    public String getProduct_belong() {
        return product_belong;
    }
    public void setProduct_belong(String product_belong) {
        this.product_belong = product_belong;
    }
    public String getCybbm() {
        return cybbm;
    }
    public void setCybbm(String cybbm) {
        this.cybbm = cybbm;
    }
    public Long getSysId() {
        return sysId;
    }
    public void setSysId(Long sysId) {
        this.sysId = sysId;
    }
    public String getSysName() {
        return sysName;
    }
    public void setSysName(String sysName) {
        this.sysName = sysName;
    }
    @Override
    public int compareTo(ComLabSet s) {
        Long productId1 = this.getProductId();
        Long productId2 = s.getProductId();
        return productId1>productId2 ? 1 : productId1 == productId2 ? 0 : -1;
    }

}

View Code

Map<Long,List<ComLabSet>> xianTypeMap = xianList.stream().collect(Collectors.groupingBy(ComLabSet::getProductId));

结果类似于下面:Map的键是分组字段productId ,值是一组的list

 

时间: 2024-10-12 07:42:25

【java】Stream的使用的相关文章

Think in java Stream 经典

stream import java.io.*; public class NewIODemo {public static void main(String[] args) { try {   // 1. Reading input by lines:   BufferedReader in =   new BufferedReader(   new FileReader(args[0]));   String s, s2 = new String();   while((s = in.rea

举例讲解Java中的Stream流概念_java

1.基本的输入流和输出流 流是 Java 中最重要的基本概念之一.文件读写.网络收发.进程通信,几乎所有需要输入输出的地方,都要用到流. 流是做什么用的呢?就是做输入输出用的.为什么输入输出要用"流"这种方式呢?因为程序输入输出的基本单位是字节,输入就是获取一串字节,输出就是发送一串字节.但是很多情况下,程序不可能接收所有的字节之后再进行处理,而是接收一点处理一点.比方你下载魔兽世界,不可能全部下载到内存里再保存到硬盘上,而是下载一点就保存一点.这时,流这种方式就非常适合. 在 Jav

什么是.Net的异步机制(异步Stream读写)

异步的Stream读/写操作 下面是继承于System.IO.Stream的类 System.IO.Stream Microsoft.JScript.COMCharStream System.IO.BufferedStream System.IO.FileStream System.IO.MemoryStream System.IO.UnmanagedMemoryStream System.Security.Cryptography.CryptoStream System.Printing.Pr

Java 8 vs Scala — Part II Streams API

Stream 与 Collection 的比较 这是我按自己的意思给的一个十分简要的说明:collection 是一个有限的数据集,而 stream 是数据的一个序列,可以是有限的也可以是无限的.区别就这么简单. Streams API 是 Java 8 的一个新的 API,用于操作 collection 和 stream 数据.Collections API 会改变数据集的状态,而 Streams API 不会.例如,调用 Collections.sort(list) 会把传入的参数排好序,而

表格存储(TableStore)新功能Stream初探

阿里云自研PB级nosql数据库TableStore近期发布了新功能Stream,也就是增量通道,可以让用户实时的获取数据库中的增删改操作.很多使用TableStore的用户会定期把数据导入各类计算平台做数据的离线分析,以前的做法是使用DATAX或者使用TableStore的SDK定期拉取数据.之前我们只能采用全量拉取的办法,定期的全量拉取势必会带来很多不必要的开销,并且也失去了新增数据实时处理的可能.那有了Stream增量通道后,之前的这些痛点都会被迎刃而解. 这个功能究竟怎么使用,又可以用在

在Java中使用Lambda表达式的技巧

在本文中,我们将展示一些在 Java 8 中不太为人所了解的 Lambda 表达式技巧及其使用限制.本文的主要的受众是 Java 开发人员,研究人员以及工具库的编写人员. 这里我们只会使用没有 com.sun 或其他内部类的公共 Java API,如此代码就可以在不同的 JVM 实现之间进行移植. 快速介绍 Lambda 表达式作为在 Java 8 中实现匿名方法的一种途径而被引入,可以在某些场景中作为匿名类的替代方案. 在字节码的层面上来看,Lambda 表达式被替换成了 invokedyna

Spring Integration 5.0.0.M5 发布

Spring Integration 的第五个里程碑版本 5.0 (5.0.0.M5)发布了.Spring Integration 能在基于 Spring 的应用中进行简单的消息通信,并通过简单的适配器与外部系统集成.这些适配器提供了一个更高级别的抽象,超越了 Spring 对远程调用.消息和调度的支持.其主要目标是在保持关注点分离的同时,为构建企业集成解决方案提供一个简单的模型,该模型对产出可维护.可测试的代码来说是必不可少的. 这个版本中有21个JIRA(和一些GitHub问题),包括错误修

[Chromium] Chromium Android WebView层的设计

Chromium Android WebView是Chromium专为Android WebView提供一个对Content的封装层.从整体上来看可以理解为一个特殊化的Embedder, 功能可以概括为:    1. 对Content和部分Browser Components封装到Java实现,供AOSP WebView调用实现WebView功能.    2. 实现Android WebView使用的单进程渲染架构.    3. 配置网络模块,并实现特定需要的scheme解析. Content作

后台开发常问面试题集锦(问题搬运工,附链接)

Java基础问题 String的'+'的性能及原理 java之yield(),sleep(),wait()区别详解-备忘笔记 深入理解Java Stream流水线 抽象 & abstract关键字 Java final 修饰符知识点总结(必看篇) Java中的static关键字解析 Java 回调机制解读 Java抽象类与oop三大特征 Java时间和时间戳的相互转换 Java为什么要使用内部类? Synchronized(对象锁)和Static Synchronized(类锁)的区别 sele

完全转载 java报错Attempted read from closed stream

原链接:java报错Attempted read from closed stream  java在运行程序报错内容如下: java.io.IOException: Attempted read from closed stream.  at org.apache.http.impl.io.ChunkedInputStream.read(ChunkedInputStream.java:162)  at org.apache.http.conn.EofSensorInputStream.read(