Stream API
-
Stream是一组用来处理数组、集合的API
-
Java 8之所以费这么大功夫引入函数式编程的原因:
– 代码简洁函数式编程写出的代码简洁且意图明确,使用 stream接口从此告别 for 循环。
– 多核友好,Java函数式编程使得编写并行程序从未如此简单,需要的全部就是调用一下parallel()方法。 -
Stream特性
1:不是数据结构,没有内部存储
2:不支持索引访问
3:延迟计算
4:支持并行
5:很容易生成数组或集合(List,Set)
6:支持过滤,查找,转换,汇总,聚合等操作 -
Stream运行机制
Stream分为 源source,中间操作,终止操作。
流的源可以是一个数组、一个集合、一个生成器方法,一个I/O通道等等。
一个流可以有零个和或者多个中间操作,每一个中间操作都会返回一个新的流,供下一个操作使用。一个流只会有一个终止操作。
Stream只有遇到终止操作,它的源才开始执行遍历操作。 -
Stream的创建
1、通过数组
2、通过集合
3、通过Stream.generate方法
4、通过Stream.iterate方法
5、其他API创建 -
Stream常用API
- 中间操作
过滤 filter
去重 distinct
排序 sorted
截取 limit、skip
转换 map/flatMap
其他 peek - 终止操作
循环 forEach
计算 min、max、count、 average
匹配 anyMatch、 allMatch、 noneMatch、 findFirst、 findAny
汇聚 reduce
收集器 toArray collect
- 中间操作
自定义注解
-
注解
Annontation 是Java5开始引入的新特征,中文名称叫注解。
它提供了一种安全的类似注释的机制,用来将任何的信息戒元数据(metadata)与程序 元素(类、方法、成员变量等)进行关联。
为程序的元素(类、方法、成员变量)加上更直观更明了的说明,这些说明信息是与程序的业务逻辑无关,并且供指定的工具戒框架使用。
Annontation像一种修饰符一样,应用于包、类型、构造方法、方法、成员变量、参数 及本地变量的声明语句中。
Java注解是附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析和使用, 起到说明、配置的功能。
注解不会也不能影响代码的实际逻辑,仅仅起到辅劣性的作用。包含在 java.lang.annotation 包中。 -
注解的作用
生成文档。这是最常见的,也是java 最早提供的注解。常用的有@param @return 等
跟踪代码依赖性,实现替代配置文件功能。
在编译时进行格式检查。如@override 放在方法前,如果你这个 方法并不是覆盖了超类方法,则编译时就能检查出。 -
注解的原理
反射 -
内置注解
@Override:定义在java.lang.Override中,此注释只适用于修饰方法,表示一个方法声明打算重写超类中的另一个方法声明
@Deprecated:定义在java.lang.Deprecated中,此注释可以 修饰方法、属性、类,表示不鼓励程序员使用这样的元素,通常 是因为它很危险戒者存在更好的选择
@SuppressWarnings:定义在java.lang.SuppressWarnings中, 用来抑制编写编译时的警告信息 -
元注解
元注解的做用是负责注解其他注解,java中定义了四个标准的 meta-annotation类型,他们被用来提供对其他annotation类型作说明
这些类型和它们所支持的类在java.lang.annotation包中
– @Target:用来描述注解的使用范围(注解可以用在什么地方)
– @Retention:表示需要在什么级别保存该注释信息,描述注解的生命周期
Source < Class < Runtime
– @Document:说明该注解将被包含在javadoc中
– @Inherited:说明子类可以继承父类中的该注解 -
自定义注解
使用@interfac自定义注解时,自动继承了 java.lang.annotation.Annotation接口- 使用规则:
– @interface用来声明一个注解,格式:public @interface 注解名{}
– 其中的每一个方法实际上是声明了一个配置参数
– 方法的名称就是参数的名称
– 返回值类型就是参数的类型(返回值叧能是基本类型,Class,String,enum)
– 可以用default来声明参数的默认值
– 如果叧有一个参数成员,一般参数名为value
– 注解元素必须要有值,我们定义注解元素时,经常使用空字符串,0作为默认值
- 使用规则:
Stream API
package com.petrel.stream;
import java.util.stream.Stream;
/**
* @author Petrel
* @data 2020/7/2 18:14
*/
public class StreamDemo {
//通过数组来生成
static void gen1(){
String[] strs = {"a","b","c","d"};
Stream<String> strs1 = Stream.of(strs);//转换为Stream
strs1.forEach(System.out::println);//使用Stream中的forEach方法
}
//通过
public static void main(String[] args) {
gen1();
}
}
注解
package annotation;
/**
* @author Petrel
* @data 2020/7/5 9:14
*/
public class Annotation {
/**
*
* @param name 需要怎么样的参数
* @return 需要怎样的返回值
*/
/*
用xml和注解都可以
*/
@Deprecated
public void show(){
//@Deprecated 已经过时的 代表show方法已经过时
}
//@SuppressWarnings("all") 忽略所有的警报信息 eclipse里面经常会有波浪线 就可以用这个
}
自定义注解
自定义注解基于元注解
package annotation;
import java.lang.annotation.*;
/**
* @author Petrel
* @data 2020/7/5 9:28
*/
@MyAnnotation
public class MetaAnnotation {
public void test(){
}
}
/*这四个是元注解 作用是负责注解其他注解,比如自定义注解
@Target({ElementType.METHOD,ElementType.TYPE}) //target用来声明当前自定义的注解适合适用于什么地方,类,方法,变量,包。。。。
@Retention(RetentionPolicy.CLASS) //retention用来表示当前注解适用于什么环境,是源码级别还是类级别还是运行时环境,一般都是运行时环境
@Documented //表示该注解是否是显示在javadoc中
@Inherited //表示当前注解是否能够被继承
*/
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.CLASS)
@Documented
@Inherited
//自定义注解
@interface MyAnnotation{
//定义的方式看起来像是方法,但是实际上使用在使用注解的时候填写的参数的名称,默认的名称是value
//自定义注解中填写的所有方法都需要在使用注解的时候,添加值,很麻烦,因此包含默认值
String name() default "zhangsan";
int age() default 12;
int id() default 1;
String[] likes() default {"a","b","c"};
}