在完成对C语言的学习后,我最近开始了对C++和Java的学习,目前跟着视频学习了一些语法,也跟着敲了一些代码,有了一定的掌握程度。现在将跟着视频做的笔记进行整理。本篇博客是整理Java知识点的第三十五篇博客。

本篇博客介绍了Java的Stream流。

本系列博客所有Java代码都使用IntelliJ IDEA编译运行,版本为2022.1。所用JDK版本为JDK11

目录

Stream流

体验Stream流

Stream流的使用

Stream流的生成方式

Stream流中间操作 filter

Stream流中间操作 limit skip

Stream流中间操作 concat distinct

Stream流中间操作 sorted

Stream流中间操作 map mapToInt

Stream流终结操作 forEach count

Stream流综合练习

Stream流的收集操作


Stream流

体验Stream流

Stream流把真正的函数式编程风格引入Java中。

import java.util.ArrayList;
public class stream1 {public static void main(String[] args){ArrayList<String> list = new ArrayList<String>();list.add("Hilda");list.add("Henri");list.add("Howard");list.add("Hermine");list.add("Hilary");list.add("Harvey");list.add("Hector");list.add("Helene");list.add("Henriette");list.add("Humberto");list.add("Hernan");list.add("Hanna");list.stream().filter((String s) ->{return (s.charAt(1) == 'e');}).filter((String s) -> {return s.length() ==6;}).forEach((String s) ->{System.out.println(s);});}
}

程序将列表中第二个字符是e,并且长度是6的字符串输出。程序的输出是:

Hector
Helene
Hernan

Stream流的使用

生成流通过数据源(集合、数组等生成),如.stream()。

一个流后面可以跟随多个中间操作,目的是打开流,做出某种程度的程序过滤/映射,然后返回一个新的流,交给下一个操作使用。如filter()。

一个流只能有一个终结操作,执行后流就无法再操作,是流的最后一个操作,如forEach()。

Stream流的生成方式

Collection体系的集合可以使用默认方法stream()生成流。default Stream<E> stream()

Map体系的集合间接生成流。

数组可以通过Stream接口的静态方法of(T...values)生成流。

import java.util.HashMap;
import java.util.List;
import java.util.ArrayList;
import java.util.stream.Stream;
public class stream2 {public static void main(String[] args){List<String> al = new ArrayList<String>();Stream<String> s1 = al.stream();Set<String> hs = new HashSet<String>();Stream<String> s2 = hs.stream();Map<String,String> hm = new HashMap<String,String>();Stream<String> s3 = hm.keySet().stream();Stream<String> s4 = hm.values().stream();Stream<Map.Entry<String,String>> s5 = hm.entrySet().stream();String[] str = new String[]{"a","b","c","d"};Stream<String> s6 = Stream.of(str);}
}

程序无输出。

Stream流中间操作 filter

Stream<T> filter(Predicate predicate)对于流中的数据进行过滤。

import java.util.ArrayList;
public class streamfilter {public static void main(String[] args){ArrayList<String> list = new ArrayList<String>();list.add("Hilda");list.add("Henri");list.add("Howard");list.add("Hermine");list.add("Hilary");list.add("Harvey");list.add("Hector");list.add("Helene");list.add("Henriette");list.add("Humberto");list.add("Hernan");list.add("Hanna");list.stream().filter((String s) ->{return (s.charAt(1) == 'e');}).forEach((String s) ->{System.out.println(s);});System.out.println();list.stream().filter((String s) -> {return s.length() ==6;}).forEach((String s) ->{System.out.println(s);});}
}

程序的输出是:

Henri
Hermine
Hector
Helene
Henriette
Hernan

Howard
Hilary
Harvey
Hector
Helene
Hernan

Stream流中间操作 limit skip

Stream<T> limit(long maxSize)返回此流中的元素组成的流,截取前给定参数个数的数据。

Stream<T> skip(long n)跳过指定参数个数的数据,返回由该流的剩余元素组成的流。

import java.util.ArrayList;
public class streamlimitskip {public static void main(String[] args){ArrayList<String> list = new ArrayList<String>();list.add("Hilda");list.add("Henri");list.add("Howard");list.add("Hermine");list.add("Hilary");list.add("Harvey");list.add("Hector");list.add("Helene");list.add("Henriette");list.add("Humberto");list.add("Hernan");list.add("Hanna");list.stream().limit(6).forEach((String s) ->{System.out.println(s);});System.out.println();list.stream().skip(6).forEach((String s) ->{System.out.println(s);});System.out.println();list.stream().skip(4).limit(4).forEach((String s) ->{System.out.println(s);});}
}

程序的输出是:

Hilda
Henri
Howard
Hermine
Hilary
Harvey

Hector
Helene
Henriette
Humberto
Hernan
Hanna

Hilary
Harvey
Hector
Helene

Stream流中间操作 concat distinct

static <T> Stream <T> concat(Stream a,Stream b)合并a和b两个流为一个流。

Stream<T> distinct()返回该流的不同元素(根据Object.equals(Object))组成的流。

import java.util.ArrayList;
import java.util.stream.Stream;
public class streamconcatdistinct {public static void main(String[] args){ArrayList<String> list = new ArrayList<String>();list.add("Hilda");list.add("Henri");list.add("Howard");list.add("Hermine");list.add("Hilary");list.add("Harvey");list.add("Hector");list.add("Helene");list.add("Henriette");list.add("Humberto");list.add("Hernan");list.add("Hanna");Stream<String> s1 = list.stream().limit(10);Stream<String> s2 = list.stream().skip(2);Stream.concat(s1,s2).forEach((String s)->{System.out.print(s + "   ");});System.out.println();}
}

程序的输出是:

Hilda   Henri   Howard   Hermine   Hilary   Harvey   Hector   Helene   Henriette   Humberto   Howard   Hermine   Hilary   Harvey   Hector   Helene   Henriette   Humberto   Hernan   Hanna

import java.util.ArrayList;
import java.util.stream.Stream;
public class streamconcatdistinct {public static void main(String[] args){ArrayList<String> list = new ArrayList<String>();list.add("Hilda");list.add("Henri");list.add("Howard");list.add("Hermine");list.add("Hilary");list.add("Harvey");list.add("Hector");list.add("Helene");list.add("Henriette");list.add("Humberto");list.add("Hernan");list.add("Hanna");Stream<String> s1 = list.stream().limit(10);Stream<String> s2 = list.stream().skip(2);Stream.concat(s1,s2).distinct().forEach((String s)->{System.out.print(s + "   ");});System.out.println();}
}

程序的输出是:

Hilda   Henri   Howard   Hermine   Hilary   Harvey   Hector   Helene   Henriette   Humberto   Hernan   Hanna

Stream流中间操作 sorted

Stream<T> sorted()返回此流的元素组成的流,根据自然排序排序。

Stream<T> sorted(Comparator comparator)返回此流的元素组成的流,根据提供的comparator排序。

import java.util.ArrayList;
import java.util.Comparator;
public class streamsort {public static void main(String[] args){ArrayList<String> list = new ArrayList<String>();list.add("Hilda");list.add("Henri");list.add("Howard");list.add("Hermine");list.add("Hilary");list.add("Harvey");list.add("Hector");list.add("Helene");list.add("Henriette");list.add("Humberto");list.add("Hernan");list.add("Hanna");list.stream().sorted().forEach((String s) ->{System.out.print(s + "   ");});System.out.println();list.stream().sorted(new Comparator<String>() {public int compare(String s1,String s2){return s1.length() - s2.length();}}).forEach((String s) ->{System.out.print(s + "   ");});System.out.println();}
}

程序的输出是:

Hanna   Harvey   Hector   Helene   Henri   Henriette   Hermine   Hernan   Hilary   Hilda   Howard   Humberto   
Hilda   Henri   Hanna   Howard   Hilary   Harvey   Hector   Helene   Hernan   Hermine   Humberto   Henriette

Stream流中间操作 map mapToInt

<R> Stream<R> map(Function mapper)返回给定函数应用于此流的元素的结果组成的流。

IntStream mapToInt(ToIntFunction mapper)返回一个IntStream,其中包含将给定函数应用于此流的元素的结果。

import java.util.ArrayList;
public class streammapmaptoint {public static void main(String[] args){ArrayList<String> list = new ArrayList<String>();list.add("10");list.add("20");list.add("30");list.add("40");list.add("50");list.stream().map((String s) ->{return Integer.parseInt(s);}).forEach((Integer i) -> {System.out.println(i);});System.out.println();System.out.println(list.stream().mapToInt((String s) ->{return Integer.parseInt(s);}).sum());}
}

程序的输出是:

10
20
30
40
50

150

Stream流终结操作 forEach count

void forEach(Consumer action)对此流的每个元素执行操作。

long count()返回此流的元素数。

import java.util.ArrayList;
public class streamforeachcount {public static void main(String[] args){ArrayList<String> list = new ArrayList<String>();list.add("Hilda");list.add("Henri");list.add("Howard");list.add("Hermine");list.add("Hilary");list.add("Harvey");list.add("Hector");list.add("Helene");list.add("Henriette");list.add("Humberto");list.add("Hernan");list.add("Hanna");list.stream().forEach((String s)->{System.out.println(s);});System.out.println(list.stream().count());}
}

程序的输出是:

Hilda
Henri
Howard
Hermine
Hilary
Harvey
Hector
Helene
Henriette
Humberto
Hernan
Hanna
12

Stream流综合练习

public class actor {private String name;actor(){}actor(String name){this.name = name;}public void setname(String name){this.name = name;}public String getname(){return name;}
}

这是actor类,有成员变量name。

import java.util.ArrayList;
import java.util.stream.Stream;
public class streamtest {public static void main(String[] args){ArrayList<actor> manlist = new ArrayList<actor>();actor man1 = new actor("Peter");actor man2 = new actor("Philippe");actor man3 = new actor("Pablo");actor man4 = new actor("Paine");actor man5 = new actor("Paul");actor man6 = new actor("Polo");manlist.add(man1);manlist.add(man2);manlist.add(man3);manlist.add(man4);manlist.add(man5);manlist.add(man6);ArrayList<actor> womanlist = new ArrayList<actor>();actor woman1 = new actor("Paula");actor woman2 = new actor("Patty");actor woman3 = new actor("Paulette");actor woman4 = new actor("Pamela");actor woman5 = new actor("Pilar");actor woman6 = new actor("Priscilla");womanlist.add(woman1);womanlist.add(woman2);womanlist.add(woman3);womanlist.add(woman4);womanlist.add(woman5);womanlist.add(woman6);Stream<actor> man = manlist.stream().filter((actor act)->{return (act.getname().length() < 6);}).limit(4);Stream<actor> woman = womanlist.stream().filter((actor act)->{return (act.getname().length() < 9);}).skip(2);Stream<actor> people = Stream.concat(man,woman);people.forEach((actor act)->{System.out.println(act.getname());});}
}

程序创建了两个存储actor类对象的ArrayList集合,分别加入6个对象,随后按条件进行操作。

程序的输出是:

Peter
Pablo
Paine
Paul
Paulette
Pamela
Pilar

Stream流的收集操作

工具类Collectors提供了具体收集方式,把流中的数据收到集合中:

public static <T> Collector toList()将元素收集到List集合中。

public static <T> Collector toSet()将元素收集到Set集合中。

public static Collector toMap(Function keyMapper,Function valueMapper)将元素收集到Map集合中。

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class streamcollect {public static void main(String[] args){ArrayList<String> strlist = new ArrayList<String>();strlist.add("Pamela");strlist.add("Peter");strlist.add("Paine");strlist.add("Paula");strlist.add("Pilar");strlist.add("Philippe");strlist.add("Paul");strlist.add("Patty");strlist.add("Priscilla");strlist.add("Pablo");strlist.add("Polo");strlist.add("Paulette");Stream<String> s1 = strlist.stream().filter((String s)->{return s.length() < 7;});ArrayList<String> s1list = (ArrayList<String>) s1.collect(Collectors.toList());for(String s:s1list){System.out.print(s + "   ");}System.out.println();HashSet<Integer> intset = new HashSet<Integer>();intset.add(21);intset.add(19);intset.add(22);intset.add(16);intset.add(20);intset.add(23);Stream<Integer> s2 = intset.stream().filter((Integer i) ->{return i > 18;});HashSet<Integer> s2set = (HashSet<Integer>) s2.collect(Collectors.toSet());for(Integer i:s2set){System.out.println(i + "   ");}System.out.println();String[] strarr = new String[]{"Pamela,21","Peter,18","Paine,16","Paula,22","Pilar,15","Philippe,21","Paul,20","Patty,20","Priscilla,19","Pablo,23","Polo,18","Paulette,22"};Stream<String> s3 = Stream.of(strarr).filter((String s) ->{return Integer.parseInt(s.split(",")[1]) > 18;});HashMap<String,Integer> s3map = (HashMap<String, Integer>) s3.collect(Collectors.toMap((String s) ->{return s.split(",")[0];},(String s) ->{return Integer.parseInt(s.split(",")[1]);}));Set<String> hs = s3map.keySet();for(String s:hs){System.out.println(s + s3map.get(s));}}
}

程序的输出是:

Pamela   Peter   Paine   Paula   Pilar   Paul   Patty   Pablo   Polo   
19   20   21   22   23   
Pablo23
Philippe21
Pamela21
Priscilla19
Paulette22
Paula22
Paul20
Patty20

Java学习笔记(三十五)相关推荐

  1. Java学习笔记二十五:Java面向对象的三大特性之多态

    Java面向对象的三大特性之多态 一:什么是多态: 多态是同一个行为具有多个不同表现形式或形态的能力. 多态就是同一个接口,使用不同的实例而执行不同操作. 多态性是对象多种表现形式的体现. 现实中,比 ...

  2. 【Java学习笔记之十五】Java中的static关键字解析

    Java中的static关键字解析 static关键字是很多朋友在编写代码和阅读代码时碰到的比较难以理解的一个关键字,也是各大公司的面试官喜欢在面试时问到的知识点之一.下面就先讲述一下static关键 ...

  3. JAVA学习笔记(三十九)-打印流

    import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.PrintStream; i ...

  4. JavaScript学习笔记(十五)

    JavaScript学习笔记(十五) 事件 事件是DOM(文档对象模型)的一部分.事件流就是事件发生顺序,这是IE和其他浏览器在事件支持上的主要差别. 一.事件流 1.冒泡型事件 IE上的解决方案就是 ...

  5. OpenCV学习笔记(十五):图像仿射变换:warpAffine(),getRotationMatrix2D()

    OpenCV学习笔记(十五):图像仿射变换:warpAffine(),getRotationMatrix2D() 一个任意的仿射变换都能表示为乘以一个矩阵(线性变换)接着再加上一个向量(平移)的形式. ...

  6. Mr.J-- jQuery学习笔记(三十二)--jQuery属性操作源码封装

    扫码看专栏 jQuery的优点 jquery是JavaScript库,能够极大地简化JavaScript编程,能够更方便的处理DOM操作和进行Ajax交互 1.轻量级 JQuery非常轻巧 2.强大的 ...

  7. cortex_m3_stm32嵌入式学习笔记(十五):待机唤醒实验(WK_UP外部中断)

    cortex_m3_stm32嵌入式学习笔记(十五):待机唤醒实验(WK_UP外部中断) https://blog.csdn.net/qq_16255321/article/details/43086 ...

  8. tensorflow学习笔记(三十二):conv2d_transpose (解卷积)

    tensorflow学习笔记(三十二):conv2d_transpose ("解卷积") deconv解卷积,实际是叫做conv_transpose, conv_transpose ...

  9. MATLAB学习笔记(十五)

    MATLAB学习笔记(十五) 一.非线性方程求解与函数极值计算 1.1 非线性方程数值求解 1.2 函数极值的计算 1.2.1 无约束最优化问题 1.2.2 有约束最优化问题 一.非线性方程求解与函数 ...

  10. 学习笔记(十五)——镜像的知识点与注意事项

    学习笔记(十五)--镜像的知识点与注意事项 一.基础知识 1.SQL Server镜像只有两种模式:高安全模式和高性能模式.两种模式的主要区别在于在事务提交后的操作. 在高性能模式下,主体服务器不需要 ...

最新文章

  1. 遗传算法对于神经网络的优生优育
  2. laravel安装笔记 (转)
  3. fiddler和xampp安装成功后,网站打不开的原因
  4. 【计算机本科补全计划】Mysql 学习小计(2)
  5. shell脚本if条件总结
  6. 数学建模之图论——图与网络模型(一)(基本概念和最短路问题,附MATLAB源码)
  7. mac电脑上的效率工具:alfred 4
  8. HTML 网页制作 盒子设计 CSS
  9. [从零开始学FPGA编程-4]:快速入门篇 - 操作步骤1 - 常见可编程器件PROM、PLA、PAL、GAL、CPLD、FPGA
  10. 大数据早报:阿里巴巴收购以色列创业公司 迅雷再次回应玩客云用户维权事件(12.1)
  11. 中国房价走势分析——基础数据收集
  12. WindowsXP支持最多64G内存的工具震撼登场
  13. micro-app 微前端脚手架搭建
  14. 跨考计算机考研华科还是中科大,2018中科大计算机考研经验贴
  15. TDSQL-C PostgreSQL(CynosDB) 内核解密-披荆斩棘,勇往直前的腾讯云数据库
  16. Kibana【从无到有从有到无】【搜索引擎】【K4】可视化
  17. 计算机二级中文化程度,文化程度代码对照表
  18. 逐步回归(stepwise regression)完整指南
  19. 【sanic】介绍 1
  20. linux jdk8下载

热门文章

  1. 《杀出个黎明》(From Dusk Till Dawn)--This is the fucking movie
  2. 做seo为什么要了解网站?
  3. 1_deep-learning-intro
  4. 计算机哈利波特音乐,【拼装延时】LEGO乐高 哈利波特系列 75954 霍格沃茨大礼堂...
  5. javascript原型、原型链神图
  6. 什么是高端的IPv6?和IPv4有什么差别呢?
  7. C语言 vs要安装什么_水电安装装修知识|水电安装要注意什么?
  8. notepad++如何安装compare插件
  9. 三相直流电机-利用反电动势的过零点来测转子位置在讨论无转子位置
  10. 基于JAVA的简单迷宫游戏