项目马上切java8了,之前对于java8的东西都是东打一棒西打一锤的了解了些。这次搜集整理了下,从lambda到stream相关的API等。

1.Lambda和匿名内部类

Lambda 是一个匿名的函数,我们可以把 Lambda 表达式理解为是一段可以传递的代码(将代码像数据一样进行传递),我一直都认为它就是匿名内部类的变种进化。

匿名内部类:

//匿名内部类
Runnable runnable1 = new Runnable() {
@Override
public void run() {
System.out.println("匿名内部类");
}
};

Lambda表达式:

//lambda表达式
Runnable runnable2 = () -> System.out.println("lambda");

2.Lambda语法:

Lambda 表达式在Java 语言中引入了一个新的语法元素和操作符。这个操作符为 “->”,将表达式分成两部分,左边是参数体,右边是Lambda体,需要函数式接口(接口中只有一个抽象方法的接口,称为函数式接口) 的支持,可以使用注解 @FunctionalInterface 修饰

几种语法格式:

其中:

  只有一个参数,可以省略小括号

  Lambda体只有一条语句可以省略{}

  参数类型可以省略,编译器可以通过上下文推断参数类型

        //无参无返回/大括号省略
Runnable runnable3 = () -> System.out.println("lambda"); //有参无返回/小括号省略
Consumer<String> consumer = (args) -> System.out.println(args);
Consumer<String> consumer2 = args -> System.out.println(args); //有参有返回值/参数类型省略
Function<Integer, Integer> function = x -> x + 1;
Function<Integer, Integer> function1 = (Integer x) -> x + 1;
//lambda体内正常逻辑操作
Function<Integer, Integer> function3 = (Integer x) -> {
if(x < 100) {
return x;
}
return x + 1;
};

3. java8 内置函数式接口(java.util.function包)

主要分为四种类型(主要就是对应几种方法类型,有参无返回,无参有返回,有参有返回)
Consumer<T> : 消费型接口
void accept(T t); Supplier<T> : 供应型接口
T get(); Function<T, R> : 功能型接口
R apply(T t); Predicate<T> : 断言型接口
boolean test(T t);

其他的几乎都是在这四种类型上面进行的扩展,比如 DoubleConsumer 指定了参数类型是double,void accept(double value); ,而Consumer的参数类型是泛型 void accept(T t);,再比如BiFunction和Function相比就是入参变成了两个R apply(T t);,R apply(T t, U u);

4.Lambda语法的另外一种形式 --- 方法引用

若 Lambda 体中的功能,已经有方法提供了实现,可以使用方法引用,前提是接口抽象方法的参数和已经有方法的参数一致,表现形式如下:

1. 对象实例::实例方法名

2. 类名::静态方法名

3. 类名::实例方法名

注意: 第三种表现形式需要Lambda 的参数列表的第一个参数,是实例方法的调用者,第二个参数(或无参)是实例方法的参数时,格式:ClassName::MethodName

        Student student = new Student(101, "张三", 18, 95);

        Supplier<String> sup = () -> student.getName();
System.out.println(sup.get());
//对象实例::实例方法名 同上
sup = student::getName;
System.out.println(sup.get()); Comparator<Integer> com = (x, y) -> Integer.compare(x, y);
//类名::静态方法名 同上
Comparator<Integer> com1 = Integer::compare; //类名::实例方法名 第一个参数是Student实例 lambda体调用Student的show方法ClassName::MethodName
Function<Student, String> fun = Student::show;
System.out.println(fun.apply(student));

5.Lambda语法的另外一种形式 --- 构造器引用

构造器的参数列表,需要与函数式接口中方法参数列表保持一致

表现形式:类名::new

数组引用:函数式接口中方法参数是新数组的长度

表现形式:类型[]::new

        //构造器引用
Function<String, Student> fun1 = Student::new; Function<Integer, String[]> fun2 = (args) -> new String[args];
String[] strs = fun2.apply(2);
System.out.println(strs.length);
//数组引用 效果同上
Function<Integer, Student[]> fun3 = Student[]::new;
Student[] students = fun3.apply(20);
System.out.println(students.length);

Student代码:

    private int id;
private String name;
private int age;
private double score; public Student(String name) {
this.name = name;
} public Student(int id, String name, int age, double score) {
this.id = id;
this.name = name;
this.age = age;
this.score = score;
} public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public double getScore() {
return score;
} public void setScore(double score) {
this.score = score;
} public String show() {
return "测试方法引用";
}

最新文章

  1. django文件批量上传-简写版
  2. DOM技术实现竞赛题页面
  3. Cocos2d-x 3.2 学习笔记(十四)保卫萝卜之界面UI
  4. linux下vi操作出现E325: ATTENTION的解决方法
  5. [matlab]改变矩阵的大小并保存到txt文件
  6. 在EF的code frist下写稳健的权限管理系统:界面设计(四)
  7. PHP读取xml之cdata讲解
  8. 文件大小的友好输出及其 Python 实现
  9. SQLite 字符串连接
  10. sublime text 3文件标题无法显示中文的解决办法
  11. Cocos2d-x 3.0 Android改动APK名、更改图标、改动屏幕方向、改动版本,一些须要注意的问题
  12. order调用mdp
  13. 建立第一个SpringBoot小列子(碰到的错误)
  14. Android 官方DEMO - ActionBarCompat-Basic
  15. KVM虚拟化技术(一)虚拟化简介
  16. 比特币算法——SHA256算法介绍
  17. 纯css滚动视差
  18. Codeforces.835E.The penguin&#39;s game(交互 按位统计 二分)
  19. iOS 开发的一些网址
  20. Velocity使用总结

热门文章

  1. 使用SSH+SFTP操作终端全解析,告别XShell
  2. 深入学习Spring框架(二)- 注解配置
  3. 洛谷P1003 铺地毯 noip2011提高组day1T1
  4. springcloud-路由Zull
  5. MacOS使用GitBook制作电子书
  6. Java编程思想:内部类中级部分
  7. JDK1.8--体验Stream表达式,从一个对象集合中获取每一个对象的某一个值返回新集合
  8. Python 3.5学习笔记(第一章)
  9. 个人永久性免费-Excel催化剂功能第59波-快速调用Windows内部常用工具命令
  10. 题解 P1864 【[NOI2009]二叉查找树】