当前位置: 代码迷 >> 综合 >> Java jdk8 中的stream 用法
  详细解决方案

Java jdk8 中的stream 用法

热度:59   发布时间:2023-11-22 21:00:33.0

Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。

Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。

Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。

这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。

元素流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果。

Stream(流)是一个来自数据源的元素队列并支持聚合操作

  • 元素是特定类型的对象,形成一个队列。 Java中的Stream并不会存储元素,而是按需计算。
  • 数据源 流的来源。 可以是集合,数组,I/O channel, 产生器generator 等。
  • 聚合操作 类似SQL语句一样的操作, 比如filter, map, reduce, find, match, sorted等。

和以前的Collection操作不同, Stream操作还有两个基础的特征:

  • Pipelining: 中间操作都会返回流对象本身。 这样多个操作可以串联成一个管道, 如同流式风格(fluent style)。 这样做可以对操作进行优化, 比如延迟执行(laziness)和短路( short-circuiting)。
  • 内部迭代: 以前对集合遍历都是通过Iterator或者For-Each的方式, 显式的在集合外部进行迭代, 这叫做外部迭代。 Stream提供了内部迭代的方式, 通过访问者模式(Visitor)实现。

 实际运用如下

package com.example.demo.util.shiyan;import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.example.demo.pojo.ResponseObject;
import com.example.demo.util.Base64;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.util.*;
import java.util.stream.Collectors;
public class Test {public static void main(String args[]){streamLianxi();test1();}public static void streamLianxi(){List<Student> list = new ArrayList<>();Student student1 = new Student();student1.setAge("12");student1.setSex(0);student1.setName("拉拉");Student student2 = new Student();student2.setAge("13");student2.setSex(2);student2.setName("嘿嘿");Student student3 = new Student();student3.setAge("11");student3.setSex(1);student3.setName("秀秀");Student student4 = new Student();student4.setAge("18");student4.setSex(1);student4.setName("天天");Student student5 = new Student();student5.setAge("18");student5.setSex(0);student5.setName("小白");Student student6 = new Student();student6.setAge("18");student6.setSex(2);student6.setName("小美");Student student7 = new Student();student7.setAge("18");student7.setSex(2);student7.setName("小明");Student student8 = new Student();student8.setAge("12");student8.setSex(1);student8.setName("小丁");list.add(student1);list.add(student2);list.add(student3);list.add(student4);list.add(student5);list.add(student6);list.add(student7);list.add(student8);list.forEach(System.out::println);//过滤年龄大于13的学生List<Student> list2=list.stream().filter(student -> new Integer(student.getAge())>13).collect(Collectors.toList());list2.forEach(student->{System.out.println(student.getAge());});System.out.println("-----------------------------------");//打印性别为0的人List<Student> list3=list.stream().filter(student -> Integer.valueOf(student.getSex())==0).collect(Collectors.toList());list3.forEach(student->{System.out.println(student.getAge());});System.out.println("-----------------------------------");//多条件排序List<Student> list4=list.stream().sorted(Comparator.comparing(Student::getAge)).collect(Collectors.toList());list4.forEach(student->{System.out.println(student.getAge());});System.out.println("-----------------------------------");//多条件倒叙排序List<Student> list5=list.stream().sorted(Comparator.comparing(Student::getAge).reversed().thenComparing(Student::getSex)).collect(Collectors.toList());list5.forEach(student->{System.out.println(student.getAge()+" "+student.getSex());});System.out.println("-----------------------------------");Map<String, List<Student>> groupBy = list.stream().collect(Collectors.groupingBy(Student::getAge));System.out.println(groupBy);Set<String> idSet=groupBy.keySet();for (String id:idSet) {System.out.println(id+groupBy.get(id));}System.out.println("获取key的值"+groupBy.keySet());System.out.println(" "+groupBy.get("11").get(0).getName());}
static void test1(){List<Double> cost = Arrays.asList(10.0, 30.0,20.0);System.out.println("=============foreach循环=============");cost.stream().forEach(x->{if(x==10.0){x=1.0;}});cost.stream().forEach(System.out::println);System.out.println("=============map成为新的对象=============");cost.stream().map(x -> x + x*0.05).forEach(x -> System.out.println(x));System.out.println("=============reduce计算总和=============");double arraysSum=cost.stream().map(x -> x*10).reduce((sum,x)->sum+x).get();System.out.println("arraysSum"+arraysSum);System.out.println("=============filter筛选=============");List<Double> list=cost.stream().filter(x->x>10).collect(Collectors.toList());list.stream().forEach(System.out::println);}
}

运行结果
 

com.example.demo.util.shiyan.Student@5afa04c
com.example.demo.util.shiyan.Student@6ea12c19
com.example.demo.util.shiyan.Student@6a024a67
com.example.demo.util.shiyan.Student@7921b0a2
com.example.demo.util.shiyan.Student@174d20a
com.example.demo.util.shiyan.Student@66d2e7d9
com.example.demo.util.shiyan.Student@1efbd816
com.example.demo.util.shiyan.Student@6a2bcfcb
18
18
18
18
-----------------------------------
12
18
-----------------------------------
11
12
12
13
18
18
18
18
-----------------------------------
18 0
18 1
18 2
18 2
13 2
12 0
12 1
11 1
-----------------------------------
{11=[com.example.demo.util.shiyan.Student@6a024a67], 12=[com.example.demo.util.shiyan.Student@5afa04c, com.example.demo.util.shiyan.Student@6a2bcfcb], 13=[com.example.demo.util.shiyan.Student@6ea12c19], 18=[com.example.demo.util.shiyan.Student@7921b0a2, com.example.demo.util.shiyan.Student@174d20a, com.example.demo.util.shiyan.Student@66d2e7d9, com.example.demo.util.shiyan.Student@1efbd816]}
11[com.example.demo.util.shiyan.Student@6a024a67]
12[com.example.demo.util.shiyan.Student@5afa04c, com.example.demo.util.shiyan.Student@6a2bcfcb]
13[com.example.demo.util.shiyan.Student@6ea12c19]
18[com.example.demo.util.shiyan.Student@7921b0a2, com.example.demo.util.shiyan.Student@174d20a, com.example.demo.util.shiyan.Student@66d2e7d9, com.example.demo.util.shiyan.Student@1efbd816]
获取key的值[11, 12, 13, 18]秀秀
=============foreach循环=============
10.0
30.0
20.0
=============map成为新的对象=============
10.5
31.5
21.0
=============reduce计算总和=============
arraysSum600.0
=============filter筛选=============
30.0
20.0

JDK8 stream的分组功能LIST.STREAM().COLLECT(COLLECTORS.GROUPINGBY(对象VO::分组标志字段))使用如下

package io.renren;import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import io.renren.common.utils.MD5;
import io.renren.modules.job.entity.StudentEntity;
import org.apache.commons.lang.StringUtils;
import org.apache.poi.util.StringUtil;
import org.junit.Test;import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.security.NoSuchAlgorithmException;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;public class TestDemo {@Testpublic void group(){List<Map<String,Object>> list = new ArrayList<>();Map<String,Object> map=new HashMap<>();map.put("name","啦啦啦");map.put("sex","男");map.put("age","23");list.add(map);Map<String,Object> map2=new HashMap<>();map2.put("name","嘿嘿嘿");map2.put("sex","男");map2.put("age","23");list.add(map2);Map<String,Object> map3=new HashMap<>();map2.put("name","嘿嘿嘿");map2.put("sex","女");map2.put("age","23");list.add(map3);Map<String,Object> map4=new HashMap<>();map4.put("name","哟哟哦");map4.put("sex","女");map4.put("age","26");list.add(map4);//根据名称分组Map<String,List<Map<String, Object>>> collectMap = list.stream().filter(item-> StringUtils.isNotBlank((String)item.get("name"))).collect(Collectors.groupingBy(e->(String) e.get("name")));//获取现在整理出来的不同的nameSystem.out.println("分组中的name如下==========================");for (String name : collectMap.keySet()) {System.out.println("name:"+name);}}}

返回结果如下

分组中的name如下==========================
name:嘿嘿嘿
name:啦啦啦
name:哟哟哦

list stream 的anyMatch的使用
 

package io.renren;import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import io.renren.common.utils.MD5;
import io.renren.modules.job.entity.StudentEntity;
import org.apache.commons.lang.StringUtils;
import org.junit.Test;import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.security.NoSuchAlgorithmException;
import java.util.*;
import java.util.stream.Collectors;public class TestDemo {@Testpublic void include(){List<Map<String,Object>> urlList= new ArrayList<>();Map<String,Object> map1=new HashMap<>();map1.put("url","/company/companyAdd");urlList.add(map1);Map<String,Object> map2=new HashMap<>();map2.put("url","/company/companyDel");urlList.add(map2);Map<String,Object> map3=new HashMap<>();map3.put("url","/personal/personalAdd");urlList.add(map3);Map<String,Object> map4=new HashMap<>();map3.put("url",null);urlList.add(map3);String url = "http://localhost:8908/company/companyAdd";if(urlList.stream().filter(e ->StringUtils.isNotBlank((String) e.get("url"))).anyMatch(e-> url.endsWith((String) e.get("url")))){System.out.println("list里有值在此url里");//其他业务逻辑}else {System.out.println("list里无值在此url里");//其他业务逻辑}}
}

结果如下
 

Connected to the target VM, address: '127.0.0.1:50599', transport: 'socket'
list里有值在此url里
Disconnected from the target VM, address: '127.0.0.1:50599', transport: 'socket'Process finished with exit code 0

 

  相关解决方案