Stream流

1. 生成方式

Stream流 函数式编程 牛逼666 用到Lambda表达式

Stream流操作:

stream流的使用

  • 生成流
    通过数据源(集合,数组等)
    生成流list.stream()
  • 中间操作
    一个流后面可以跟随零个或多个中间操作,其目的主要是打开流,做出某种程度的数据过滤/映射,然后返回一个新的流,交给下一个操作使用
  • 终结操作
    一个流只能有一个终结操作,当这个操作执行后,流就被使用“光”了,无法再被操作。所以这必定是流的最后一个操作forEach()

常见的生成流的方式:

  • Collection体系的集合可以使用默认方法stream()生成流
  • Map体系的集合间接的生成流
  • 数组可以通过Stream接口的静态方法of(T… values)生成流
package Lambda;import java.util.*;
import java.util.stream.Stream;//测试类
public class Demo {public static void main(String[] args) {//Collection体系生成流 默认方法生成流List<String> list = new ArrayList<>();Stream<String> liststream = list.stream();Set<String> set = new HashSet<>();Stream<String> setstream = set.stream();//Map体系生成流,间接生成流Map<String, Integer> map = new HashMap<>();Stream<String> keySetStream = map.keySet().stream();Stream<Integer> valueStream = map.values().stream();Stream<Map.Entry<String, Integer>> entryStream = map.entrySet().stream();//数组通过Stream接口的静态方法of 生成流String[] str = {"hello", "world", "java"};Stream<String> strStream = Stream.of(str);Stream<String> strStream1 = Stream.of("hello", "world", "java");Stream<Integer> integerStream = Stream.of(10, 20, 30, 40);}
}

2. Stream常见的中间操作方法

2.1 filter

  • Stream filter(Predicate predicate):用于对流中的数据进行过滤Predicate接口中的方法
  • boolean test(T t):对给定的参数进行判断,返回一个布尔值
package Lambda;import java.util.*;//测试类
public class Demo {public static void main(String[] args) {ArrayList<String> arrayList = new ArrayList<>();arrayList.add("张添胜");arrayList.add("张天");arrayList.add("张天神");arrayList.add("文天");arrayList.add("胜");arrayList.add("添胜");arrayList.add("张天胜");System.out.println(arrayList);arrayList.stream().filter(s -> s.startsWith("张")).filter(s -> s.length() >= 3).forEach(System.out::println);//张添胜//张天神//张天胜}
}

2.2 limit和skip

  • Stream limit(long maxSize):返回此流中的元素组成的流,截取前指定参数个数的数据
  • Stream skip(long n):跳过指定参数个数的数据,返回由该流的剩余元素组成的流
package Lambda;import java.util.*;//测试类
public class Demo {public static void main(String[] args) {ArrayList<String> arrayList = new ArrayList<>();arrayList.add("张添胜");arrayList.add("张天");arrayList.add("张天神");arrayList.add("文天");arrayList.add("胜");arrayList.add("添胜");arrayList.add("张天胜");//取前三个 输出arrayList.stream().limit(3).forEach(System.out::println);System.out.println("---------------------");//跳过前三个arrayList.stream().skip(3).forEach(System.out::println);System.out.println("---------------------");//跳过前两个,剩下的前三个arrayList.stream().skip(2).limit(3).forEach(System.out::println);}
}

2.3 concat和distint

  • static Stream concat(Stream a, Stream b):合并a和b两个流为一个流
  • Stream distinct():返回由该流的不同元素(去重)(根据Objectequals(Object))组成的流
package Lambda;import java.util.*;
import java.util.stream.Stream;//测试类
public class Demo {public static void main(String[] args) {ArrayList<String> arrayList = new ArrayList<>();arrayList.add("张添胜");arrayList.add("张天");arrayList.add("张天神");arrayList.add("文天");arrayList.add("胜");arrayList.add("添胜");arrayList.add("张天胜");//流1:前四个   .3Stream<String> s1 = arrayList.stream().limit(4);//流2:跳过前两个  5Stream<String> s2 = arrayList.stream().skip(2);//合并两个流 输出//Stream.concat(s1,s2).forEach(System.out::println);//合并, 去重 输出Stream.concat(s1, s2).distinct().forEach(System.out::println);}
}

2.4 sorted

  • Stream sorted):返回由此流的元素组成的流,根据自然顺序排序
  • Stream sorted(Comparator comparator):返回由该流的元素组成的流,根据提供的Comparator进行排序
package Lambda;import java.util.*;//测试类
public class Demo {public static void main(String[] args) {ArrayList<String> arrayList = new ArrayList<>();arrayList.add("adjflka");arrayList.add("jfldfjaldk");arrayList.add("osdfsf");arrayList.add("xncod");arrayList.add("werod");arrayList.add("nclasdnf");//按照字母顺序排序 默认//  arrayList.stream().sorted().forEach(System.out::println);//按照字符串长度 次:字母顺序arrayList.stream().sorted((s1, s2) -> {int num = s1.length() - s2.length();int num1 = num == 0 ? s1.compareTo(s2) : num;return num1;}).forEach(System.out::println);//werod//xncod//osdfsf//adjflka//nclasdnf//jfldfjaldk}
}

2.5 Map和MapToInt

  • Stream map(Function mapper):返回由给定函数应用于此流的元素的结果组成的流Function接口中的方法 R apply(T t)
  • IntStream mapTolnt(TolntFunction mapper):返回一个Stream其中包含将给定函数应用于此流的元素的结果 , 比如sum()

IntStream:表示原始int流
ToIntFunction接口中的方法 : int applyAsInt(T value)

package Lambda;import java.util.*;//测试类
public class Demo {public static void main(String[] args) {ArrayList<String> arrayList = new ArrayList<>();arrayList.add("10");arrayList.add("20");arrayList.add("30");arrayList.add("40");arrayList.add("50");//Stirng -> int , 输出arrayList.stream().map(Integer::parseInt).forEach(System.out::println);arrayList.stream().mapToInt(Integer::parseInt).forEach(System.out::println);//都可以转类型//mapToInt求和int sum = arrayList.stream().mapToInt(Integer::parseInt).sum(); //注意返回类型System.out.println(sum);}
}

3. Stream常见的终结操作方法

  • forEach()方法:对每个元素操作
  • count()方法:返回此流的元素数
package Lambda;import java.util.*;//测试类
public class Demo {public static void main(String[] args) {ArrayList<String> arrayList = new ArrayList<>();arrayList.add("张添胜");arrayList.add("张天");arrayList.add("张天神");arrayList.add("文天");arrayList.add("添胜");arrayList.add("张天胜");//姓张的数量long sum = arrayList.stream().filter(s -> s.startsWith("张")).count();System.out.println(sum);//4}
}

Stream练习:

package Lambda;import java.util.*;
import java.util.stream.Stream;//测试类
public class Demo {public static void main(String[] args) {//创建男女集合ArrayList<String> manList = new ArrayList<>();manList.add("周润发");manList.add("成龙");manList.add("刘德华");manList.add("吴京");manList.add("周星驰");manList.add("李连杰");ArrayList<String> womanList = new ArrayList<String>();womanList.add("林心如");womanList.add("张曼玉");womanList.add("林青霞");womanList.add("柳岩");womanList.add("林志玲");womanList.add("王祖贤");//男演员只要名字3个字 前三人Stream<String> manStream = manList.stream().filter(s -> s.length() == 3).limit(3);//女演员 姓林 第一个不要Stream<String> womanStream = womanList.stream().filter(s -> s.startsWith("林")).skip(1);//合并过滤后的男女Stream<String> concatStream = Stream.concat(manStream, womanStream);//把结果创建成对象concatStream.map(Actor::new).forEach(p -> System.out.println(p.getName()));//这确实离谱 创建对象的Lambda表达式不熟练System.out.println("-----------------------");//熟练方法Stream.concat(manList.stream().filter(s -> s.length() == 3).limit(3),womanList.stream().filter(s -> s.startsWith("林")).skip(1)).map(Actor::new).forEach(p -> System.out.println(p.getName()));}
}

4. Stream流的收集操作

把流中的数据收集到集合中:
收集方法:

  • R collect(Collector collector)
  • 但是这个收集方法的参数是一个Collector接口

工具类Collectors提供了具体的收集方式:

  • public static Collector toListi():把元素收集到List集合中
  • public static Collector toSet():把元素收集到Set集合中
  • publicstatic Collector toMap(Function keyMapper,Function valueMapper):把元素收集到Map集合中
package Lambda;import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;//测试类
public class Demo {public static void main(String[] args) {//  1.  名字大于3个字存入list集合 遍历List<String> list = new ArrayList<>();list.add("文天圣");list.add("天圣");list.add("文天s");list.add("文t圣");Stream<String> listStream = list.stream().filter(s -> s.length() >= 3);List<String> list1 = listStream.collect(Collectors.toList());for (String s : list1) {System.out.println(s);}//文天圣//文天s//文t圣//  2.   数值大于25存入set集合Set<Integer> set = new HashSet<>();set.add(10);set.add(20);set.add(30);set.add(32);Stream<Integer> integerStream = set.stream().filter(i -> i > 25);Set<Integer> set1 = integerStream.collect(Collectors.toSet());for (Integer i : set1) {System.out.println(i);}//32//30// 3. 流存入map集合  年龄大小于30String[] strarray = {"wts,20", "xwb,30", "cyc,40"};Stream<String> mapStream = Stream.of(strarray).filter(s -> Integer.parseInt(s.split(",")[1]) >= 30);Map<String, Integer> map1 = mapStream.collect(Collectors.toMap(k -> k.split(",")[0], v -> Integer.parseInt(v.split(",")[1])));Set<String> keySet = map1.keySet();for (String k : keySet) {Integer value = map1.get(k);System.out.println(k + value);//xwb30//cyc40}}
}

反射(一言难尽)

1. 类加载和类加载器

当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过类的加载,类的连接,类的初始化这三个步骤来对类进行初始化。如果不出现意外情况,VM将会连续完成故三个步骤,所以有时也把这三个步骤统称为类加载或者类初始化

类加载:

  • 就是指将class文件读入内存,并为之创建一个java.lang.Class对象
  • 任何类被使用时,系统都会为之建立一个java.lang.Class对象

类的连接:

  • 验证阶段:用于检验被加载的类是否有正确的内部结构,并和其他类协调一致
  • 准备阶段:负责为类的类变量分配内存,并设置默认初始化值
  • 解析阶段:将类的二进制数据中的符号引用替换为直接引用

类的初始化:
在该阶段,主要就是对类变量进行初始化

类的初始化步骤

  • 假如类还未被加载和连接,则程序先加载并连接该类
  • 假如该类的直接父类还未被初始化,则先初始化其直接父类(先父后子)
  • 假如类中有初始化语句,则系统依次执行这些初始化语句

类初始化时机

  • 创建类的实例
  • 调用类的类方法
  • 访问类或者接口的类变量,或者为该类变量赋值
  • 使用反射方式来强制创建某个类或接口对应的java.lang.Class对象
  • 初始化某个类的子类
  • 直接使用java.exe命令来运行某个主类

类加载器

2. 反射

java反射机制:
是指在运行时去获取一个类的变量和方法信息。然后通过获取到的信息来创建对象,调用方法的一种机制。由于这种动态性,可以极大的增强程序的灵活性,程序不用在编译期就完成确定,在运行期仍然可以扩展

java基础复习——day18(Stream流 ; 反射)相关推荐

  1. Java基础复习笔记系列 七 IO操作

    Java基础复习笔记系列之 IO操作 我们说的出入,都是站在程序的角度来说的.FileInputStream是读入数据.?????? 1.流是什么东西? 这章的理解的关键是:形象思维.一个管道插入了一 ...

  2. 2020604 Java基础复习

    2020/6/4 Java基础复习 Java特性和优势 1.简单性: Java是在C++的语法的基础再"减减".没有头文件,没有指针,也不用分配内存,所以相对来说比较简单; 2.面 ...

  3. Java基础复习笔记系列 九 网络编程

    Java基础复习笔记系列之 网络编程 学习资料参考: 1.http://www.icoolxue.com/ 2. 1.网络编程的基础概念. TCP/IP协议:Socket编程:IP地址. 中国和美国之 ...

  4. java 新特性之 stream 流

    java 新特性之 stream 流 Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据. 这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在 ...

  5. java基础知识之注解、反射(一)

    前言 此博客为供个人学习总结备用,如有错误请指正. 正文 Annotation(注解) java自带的注解包含以下三个: 1.@Override 注解表示重写父类的方法 2.@Deprecated 声 ...

  6. Java基础复习(六)

    Java基础复习(六) 常见关键字总结 1.final关键字 final用来修饰类.方法和变量. (1)final修饰的类不能被继承,而且final修饰的类中,所有成员方法会被默认为final方法,不 ...

  7. Java基础复习-常用类

    Java基础复习-常用类 本文仅对学习过程中所缺java知识点的查缺补漏复习 String 代表字符串.Java程序中的所有字符串字面值(如"abc")都作为此类的实例实现. St ...

  8. stream distinct去重_再来看看Java的新特性——Stream流

    半年前开始试着使用Java的新特性,给我印象最深的就是Stream流和Optional.其中Stream提高了看法效率,让代码看起来十分清爽. 为什么要使用流? 摘要中已经说明了,为了提高开发效率.流 ...

  9. java(九)-方法引用, Stream流,File类 , 递归 ,字节流

    day09[方法引用.Lambda表达式.Stream流] 今日目标 线程状态 等待与唤醒 Lambda表达式 Stream流 教学目标 能够说出线程6个状态的名称 能够理解等待唤醒案例 能够掌握La ...

最新文章

  1. 数独基本规则_数独解题技巧总结
  2. EF框架对数据库的操作
  3. python 文件编码的识别_【python】python编码方式,chardet编码识别库
  4. CodeForces - 1325D Ehab the Xorcist(构造+异或)
  5. springboot redis shiro 实现 单点登录
  6. mysql 日期型中文报错_mysql日期类型默认值'0000-00-00' 报错,是什么问题?
  7. 服务器主机安装esxi虚拟机,服务器主机安装esxi虚拟机
  8. matlab细胞数组类型建立及操作
  9. 【HTML5+MVC4】xhEditor网页编辑器图片上传
  10. 全触摸模式,让你尽享ipad 开发出的精品
  11. Mosek学习笔记2:优化
  12. css手指代码,CSS3中Animation实现简单的手指点击动画的示例
  13. 迪赛智慧数——其他图表(平行坐标图):2001 VS 2020主要城市房价及涨幅
  14. NVIDIA GPU的浮点计算能力
  15. 区域和检索 - 数组不可变(前缀和)
  16. 专精特新中小企业的政策依据
  17. 金融风控-- >申请评分卡模型-- >特征工程(特征分箱,WOE编码)
  18. 愤怒的2011幸福的生活
  19. CButton类的继承+重写--本类来自孙鑫老师C++课堂
  20. mysql 备份数据库结账_简单的结账功能(可用于各种结账)

热门文章

  1. 【unity 保卫星城】--- 开发笔记02(陀螺仪移动)
  2. java捕鱼增值版游戏下载_捕鱼游戏 java
  3. 【软件测试技术期末复习选择题】
  4. 2022年安全员-B证考试题库及安全员-B证模拟试题
  5. Qt C++ 录屏录音功能实现(avilib+ffmpeg)以及动态库生成
  6. Qt多人协作项目执行方案
  7. 付出不亚于任何人的努力
  8. sql 闩锁 原因_关于SQL Server中的闩锁
  9. 【莫安迪原创摄影作品】深圳最美夕阳-烟云成画
  10. css设置元素抛物线,CSS3 抛物线波动(Parabola Wave)